Perché in questo esempio è necessaria una classe Decorator astratta?

3

Perché abbiamo bisogno di ShapeDecorator in questo design? Perché non possiamo semplicemente avere RedShapeDecorator implementare direttamente Shape ed ereditare da Shape?

    
posta Armon Safai 24.11.2015 - 01:28
fonte

1 risposta

4

In effetti, si potrebbe tralasciare il ShapeDecorator , ma questo peggiorerebbe il design.

Per derivare RedShapeDecorator direttamente da Shape , è necessario spostare l'associazione decorates (il riferimento all '"oggetto forma decorato") da ShapeDecorator in un altro punto. Ci sono due possibilità per questo:

  1. O viene spostato in RedShapeDecorator , il che significa che si dovrà ripetere la logica di decorazione in ogni altro decoratore ( BlueShapeDecorator , GreenShapeDecorator , ...), quindi una violazione del principio DRY .

  2. Oppure viene spostato nella classe Shape :

MaquestosignificherebbeogniderivazionediShapeèancheundecoratorediunaltroShape.Tuttavia,CircleeRectanglenonsonodecoratori,quindiquestoportaaunaviolazionedel Principio di sostituzione di Liskov , e a una violazione dell'SRP, poiché ora un Shape è responsabile per il disegno di forme e per la decorazione di altre forme.

    
risposta data 24.11.2015 - 05:06
fonte