2015-04-22 23 views
8
public interface IMovable 
    { 
     void Move(); 
    } 

    public interface IUnloadable 
    { 
     void Unload(); 
    } 

    public class Vehicle : IMovable 
    { 
     public void Move() 
     { 
      Console.Write("moving"); 
     } 
    } 

    public class Truck : IMovable, IUnloadable 
    { 
     private Vehicle Veh; 

     public Truck(Vehicle veh) 
     { 
      this.Veh = veh; 
     } 

     public void Move() 
     { 
      Veh.Move(); 
      Console.Write("reverse with beepy noise as well"); 
     } 

     public void Unload() 
     { 
      Console.Write("Unload"); 
     } 
    } 

bu dekoratör desen ise. Dekoratör deseni ve kompozisyon arasındaki fark nedir? Mirasın kullanıldığı bu desenin örneklerini gördüm. Örneğin Wikipedia'daki Java örneği.Miras kalıbı olmadan C# de dekoratör kalıbı. Bu doğru mu?

Ben hiç miras kullanmayı gerek görmüyorum, yoksa bir şey eksik? tanım olarak

+0

'Dekoratör deseni ile arasındaki fark nedir? bileştirme, kompozisyon?Kavramsal olarak, bir dekoratör, sardığı (tek) nesnenin davranışını değiştirir, oysa kompozit (desen), birleştirdiği (çoklu) nesnelerin birleşimini temel alan bir davranışı vardır. – Fuhrmanator

cevap

8

dekoratörü deseni dekore edilir bileşeni olarak aynı arayüzü uygulayacaktır. Fikir, müşteri kodunun değişmesi gerekmiyor. Daha önce kullandığı aynı soyutlamaya güvenebilir. Örneğin

: Eğer NoisyMovable sınıf not Eğer IMovable soyutlama uygulayan ve aynı sarar çünkü

public interface IMovable 
{ 
    void Move(); 
} 

public class Truck : IMovable 
{ 
    public void Move() 
    { 
     Console.Write("moving"); 
    } 
} 

public class NoisyMovable : IMovable //1.Implement same interface 
{ 
    private IMovable movable; 
    public NoisyMovable(IMovable movable)//2.Wrap same interface 
    { 
     this.movable = movable; 
    } 

    public void Move() 
    { 
     movable.Move();    
     Console.Write("Make noise"); 
    } 
} 

, bir dekoratör olduğunu. Bunun üzerine

, sen NoisyVehicle gibi NoisyTruck, NoisyCar birçok sınıfları oluşturmak gerekmez vb Hemen Car, Truck yeterlidir; Tek dekoratör kullanarak sesi ekleyebilirsiniz. Öte yandan kompozisyonun uyguladığı arayüzün aynı uygulamasını sarması gerekmez. Bir arabirimi uygulayabilir ve başka bir şey yapabilir. Yanlış neyin var

sizin Truck sınıf Vehicle örneğini sürer. Olmamalı, bunun yerine IMovable örneğini almalıdır. IMovable'un herhangi bir uygulaması ile çalışmalıdır.

+1

Bu yüzden NoisyMovable sınıfının IUnloadable olması da isteniyorsa IUnloadable uygulanabiliyor ve kurucusuna IUnloadable enjekte edebiliyor muyuz? Yani iki param mı? Ya da NoisyMovable'ı süsleyen yeni bir sınıf yapmayı mı tercih edeyim? Ama sonra bir arabirim enjekte etmezdim ama somut bir sınıf ... – user1809104

+0

@ user1809104 '' NoisyMovable'' içinde 'IUnloadable' uygulayabilirsiniz ancak bu kullanışlı değil. Çünkü gevşek kuplajı takip ederseniz, onu 'IUnloadable' veya 'IMovable' olarak saklayabilirsiniz. Eğer 'IUnloadable' i dekore etmeniz gerekiyorsa, ya başka bir 'İade Edilebilir' olmanız gerekmiyor ya da 'IUnloadable' ve ayrıca 'IMovable' olan birleşik bir arayüze ihtiyacınız var. –

1

dekoratör desen ve kompozisyon arasındaki fark nedir?

Kavramsal olarak, bir dekoratör (tek) davranışını bileşik (kalıp) (çoklu) kombinasyonuna göre bir davranışa sahiptir, oysa bu sarar nesne bu agregatlar nesneleri değiştirir.

Miras alma gereksinimini hiç görmüyorum, yoksa bir şey mi eksik?

Kalıtım yararlıdır, böylece birden fazla dekoratöre sahip olabilir ve yuvalayabilirsiniz. Örneğin, bir SelfDriver bir Vehicle sarar bir Truck sarar söyledi. IUnloadable dikkate alınmadığında, ikinci dekoratör SelfDriver olacaktır:

Class diagram in PlantUML

kodu aşağıdaki gibi olacaktır:

IMovable sd = new SelfDriver(new Truck(new Vehicle()))); 

nesne şeması aşağıdaki gibi olacaktır:

Object diagram in PlantUML