Come organizzare la logica di conversione per il modello di strategia?

0

Ho una classe Color . Ha una proprietà model che è una classe che implementa l'interfaccia ColorModel , questa proprietà potrebbe essere una RGB , Hex o HSL classi che implementano l'interfaccia ColorModel .

// Color.php
class Color {

    protected $model;

    public static function factory (Model $model) {
        return new Color($model);
    }

    public function __construct (Model $model) {
        $this->model = $model;
    }

    public function getModel () {
        return $this->model;
    }

    public function set ($color) {
        $this->model->set($color);
    }

    public function raw ($string = false) {
        return $this->model->raw($string);
    }

    public function check (Color $color) {
        return get_class($this->model) === get_class($color->getModel());
    }

    public function isModel ($type) {
        return $type === $this->model->getName();
    }

    // Converter probably suppose to be a strategy which converts color model to another color model
    public function convert (Converter $convert) {
        // I'm stack here...
    }

}

// ColorModel.php
interface ColorModel {

    // Parser is a class which parses input string/int and converts it to components
    public function __construct (Parser $parser, $x, $y, $z);

    public function raw ($string = false);

    public function set ($color);

    public function getName ();

}

Non sono sicuro di come implementare la conversione di ColorModel s. Come posso implementare la conversione di questi diversi modelli senza dover creare ogni classe per ogni set ( RGB2HSL , HSL2RGB . Diciamo che aggiungo LAB class quattro altre classi: LAB2RGB , LAB2HSL , HSL2LAB , RGB2LAB e altro ancora e altro)? È possibile a tutti?

Grazie per l'attenzione!

    
posta volter9 07.12.2014 - 09:13
fonte

1 risposta

2

Se disponi di un ColorModel che può rappresentare tutti possibili colori e che puoi convertire senza perdita di informazioni, puoi designare quel ColorModel come modello "canonico".

La conversione tra% arbitrario ColorModel s diventa quindi un processo in due fasi: prima converti dal modello sorgente al modello canonico e poi converti dal modello canonico al modello di destinazione.

Ciò significa che per ogni ColorModel , è necessario un Converter in grado di convertire tra quel modello e il modello canonico (in entrambe le direzioni). Per il modello canonico questo Converter implementerebbe la trasformazione dell'identità, in modo che non sia necessaria una logica speciale se il modello di origine o di destinazione risulta essere il modello canonico.

    
risposta data 07.12.2014 - 10:56
fonte

Leggi altre domande sui tag