Dekoratormuster in C # ohne Vererbung. Ist das richtig?

8
%Vor%

Wenn dies das Dekorationsmuster ist. Was ist der Unterschied zwischen Dekorationsmuster und Zusammensetzung? Ich habe Beispiele für dieses Muster gesehen, bei dem Vererbung verwendet wird. Zum Beispiel das Java-Beispiel auf Wikipedia.

Ich sehe nicht die Notwendigkeit, Vererbung überhaupt zu verwenden, oder fehle ich etwas?

    
user1809104 22.04.2015, 09:47
quelle

2 Antworten

8

Dekoratormuster per Definition wird die gleiche Schnittstelle wie die zu dekorierende Komponente implementieren. Die Idee ist, dass der Client-Code nicht geändert werden muss. Es kann sich auf die gleiche Abstraktion verlassen, die es früher verwendet hat.

Zum Beispiel:

%Vor%

Wenn Sie die Klasse NoisyMovable notieren, handelt es sich um einen Dekorator, da sie die IMovable -Abstraktion implementiert und dieselbe umschließt.

Damit müssen Sie nicht viele Klassen wie NoisyVehicle , NoisyTruck , NoisyCar usw. erstellen. Nur die Car , Truck sind genug; Sie können das Rauschen hinzufügen, indem Sie den Einzeldekorator verwenden.

%Vor%

Die Komposition muss andererseits nicht dieselbe Implementierung der von ihr implementierten Schnittstelle umbrechen. Es kann eine Schnittstelle implementieren und jede andere umbrechen.

Was Sie falsch verstanden haben, ist, dass Ihre Truck -Klasse die Instanz von Vehicle übernimmt. Es sollte keine Instanz von IMovable sein. Es sollte mit jeder Implementierung von IMovable funktionieren.

    
Sriram Sakthivel 22.04.2015, 10:09
quelle
1
  

Was ist der Unterschied zwischen Dekorationsmuster und Zusammensetzung?

Konzeptionell ändert ein Dekorator das Verhalten des (einzelnen) Objekts, das es umschließt, während das zusammengesetzte (Muster) Verhalten auf der Kombination der (mehreren) Objekte basiert, die es aggregiert.

  

Ich sehe nicht die Notwendigkeit, Vererbung überhaupt zu verwenden, oder fehle ich etwas?

Die Vererbung ist nützlich, damit Sie mehrere Dekoratoren haben und verschachteln können. Zum Beispiel ein SelfDriver , das ein Truck umschließt, das ein Vehicle umschließt. Ignoriere IUnloadable , wäre der zweite Dekorator SelfDriver :

Der Code würde so aussehen:

%Vor%

Das Objektdiagramm würde so aussehen:

    
Fuhrmanator 22.04.2015 19:00
quelle