2015-04-22 17 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"); 
     } 
    } 

Nếu đây là mẫu trang trí. Sự khác biệt giữa mẫu trang trí và bố cục là gì? Tôi đã thấy các ví dụ về mẫu này khi sử dụng thừa kế. Ví dụ, ví dụ Java trên Wikipedia.Mẫu trang trí trong C# mà không cần Thừa kế. Điều này có đúng không?

Tôi không thấy cần phải sử dụng thừa kế, hay tôi thiếu gì đó?

+0

'Sự khác biệt giữa mẫu trang trí và thành phần?'Về mặt khái niệm, một người trang trí sửa đổi hành vi của đối tượng (đơn) nó kết thúc tốt đẹp, trong khi đó mô hình (composite) có hành vi dựa trên sự kết hợp của các đối tượng (nhiều) nó tổng hợp. – Fuhrmanator

Trả lời

8

Mẫu trang trí theo định nghĩa sẽ triển khai cùng một giao diện với thành phần mà nó trang trí. Ý tưởng là mã khách hàng không cần phải thay đổi. Nó có thể dựa vào cùng một sự trừu tượng mà nó đã sử dụng trước đó.

Ví dụ:

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"); 
    } 
} 

Nếu bạn lưu ý lớp NoisyMovable, nó là một trang trí bởi vì nó thực hiện các IMovable trừu tượng và kết thúc tốt đẹp như vậy.

Với điều đó, bạn không cần phải tạo ra nhiều lớp học như NoisyVehicle, NoisyTruck, NoisyCar vv Chỉ cần các Car, Truck là đủ; bạn có thể thêm tiếng ồn bằng cách sử dụng trang trí đơn.

IMovable movable = new NoisyMovable(new Truck());//Noisy Truck 
IMovable movable = new NoisyMovable(new Car());//Noisy car 
//etc 

Thành phần khác không cần phải thực hiện cùng một giao diện mà nó thực hiện. Nó có thể thực hiện một giao diện và bọc bất kỳ giao diện nào khác.

Những gì bạn gặp phải là lớp học Truck của bạn có phiên bản là Vehicle. Nó không nên, thay vào đó nó phải mất bất kỳ ví dụ của IMovable. Nó sẽ làm việc với bất kỳ việc thực hiện nào của IMovable.

+1

Vì vậy, nếu tôi muốn có lớp NoisyMovable được IUnloadable cũng như tôi sẽ thực hiện IUnloadable và tiêm IUnloadable vào constructor của nó? Vì vậy, hai params? Hay tôi muốn tạo một lớp mới để trang trí NoisyMovable? Nhưng sau đó tôi sẽ không tiêm một giao diện nhưng một lớp bê tông ... – user1809104

+0

@ user1809104 Bạn có thể thực hiện 'IUnloadable' trong' NoisyMovable' nhưng điều đó không hữu ích. Bởi vì bạn có thể lưu trữ nó như là một trong hai 'IUnloadable' hoặc' IMovable' nếu bạn làm theo khớp nối lỏng lẻo. Nếu bạn cần trang trí 'IUnloadable', bạn cần phải bọc một' IUnloadable' khác hoặc bạn cần một giao diện hợp nhất là 'IUnloadable' và cũng' IMovable' –

1

Sự khác nhau giữa mẫu trang trí và bố cục là gì?

Về mặt khái niệm, một trang trí sửa đổi hành vi của đối tượng (đơn) nó kết thúc tốt đẹp, trong khi mẫu (composite) có hành vi dựa trên sự kết hợp của (nhiều) đối tượng mà nó tổng hợp.

Tôi không thấy cần phải sử dụng thừa kế, hay tôi thiếu gì đó?

Thừa kế hữu ích để bạn có thể có nhiều trang trí và lồng chúng. Ví dụ: SelfDriver kết thúc tốt đẹp một Truck kết thúc tốt đẹp một Vehicle. Bỏ qua IUnloadable, các trang trí thứ hai sẽ là SelfDriver:

Class diagram in PlantUML

Mã này sẽ trông như thế này:

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

Sơ đồ đối tượng sẽ trông như thế này:

Object diagram in PlantUML

Các vấn đề liên quan