2013-04-18 43 views
5

Chủ đề này, Decorator pattern implementation, có triển khai trình trang trí sử dụng các lớp trừu tượng. Tôi không thích nó cho một thực tế đơn giản rằng một CondimentDecorator không phải là một đồ uống trong việc thực hiện đưa ra ở đó. Tôi muốn sử dụng giao diện thay thế. Không phải là các lớp trừu tượng tốt hơn cho các mối quan hệ, và các giao diện tốt hơn cho các mối quan hệ có-một?C# Trang trí - Giao diện hoặc Lớp trừu tượng?

public interface IBeverage 
{ 
    // get a description of the beverage 
    String Description { get; } 

    // calculate cost of the beverage 
    double Cost { get; } 
} 

// HouseBlend coffee implements IBeverage 
public class HouseBlend : IBeverage 
{ 
    private string description; 
    public String Description 
    { 
     get { return description; } 
    } 

    private double cost; 
    public double Cost 
    { 
     get { return cost; } 
    } 

    // Constructor 
    public HouseBlend() { description = "House Blend"; cost = 0.89; } 
} 

// DarkRoast coffee implements IBeverage 
public class DarkRoast : IBeverage 
{ 
    private string description; 
    public String Description 
    { 
     get { return description; } 
    } 

    private double cost; 
    public double Cost 
    { 
     get { return cost; } 
    } 

    // Constructor 
    public DarkRoast() { description = "Dark Roast"; cost = 1.10; } 
} 

// Mocha is a Decorator 
public class Mocha 
{ 
    // Mocha has-a Beverage 
    private IBeverage m_beverage; 

    private string description; 
    public String Description 
    { 
     get { return description; } 
    } 

    private public double Cost 
    { 
     get { return cost; } 
    } 

    // Constructor binds the object passed to member var 
    public Mocha(IBeverage beverage) 
    { 
     m_beverage = beverage; // not necessary for the purpose of this example 
     description = m_beverage.Description + ", Mocha"; 
     cost = 0.20 + m_beverage.Cost; 
    } 
} 

Use like this: 
    Mocha mhb = new Mocha(new HouseBlend()); // house blend with mocha flavor 
+0

Điều này có lẽ phù hợp hơn cho lập trình viên.stackexchange.com –

+0

Tôi hoàn toàn đồng ý, nhưng đó không phải là điểm của câu hỏi mà bạn đang đề cập đến. –

+2

Có, đốt cháy một và chỉ có lớp cơ sở của bạn trên một cái gì đó mà không phải là một mối quan hệ là một ý tưởng tồi. –

Trả lời

3

Cả hai dấu căn cứ và giao diện thường được sử dụng để mô hình là một mối quan hệ. Ngay cả một giao diện đơn giản như IDisposable có thể được hiểu là "là một đối tượng với vòng đời được kiểm soát theo cách thủ công", một "dùng một lần". Sự khác biệt hữu hình hơn là trong việc thực thi cơ sở hay các trường dữ liệu được cho phép; và khả năng kết hợp nhiều phân cấp.

Bây giờ, khi bạn đang triển khai bất kỳ mẫu nào, bạn thường có đủ thông tin để xem liệu bạn có cần trường dữ liệu hay không. Tuy nhiên, bạn sẽ hầu như không bao giờ có thể loại trừ một nhu cầu trong tương lai để liên quan đến các lớp học tương tự trong các mẫu bổ sung khi phần mềm của bạn phát triển. Từ quan điểm đó, một sở thích chung về giao diện trên các lớp trừu tượng mang đến cho bạn sự linh hoạt lâu dài hơn - bất cứ khi nào bạn có sự lựa chọn.

Do bản chất của một Người trang trí, bạn có thể lựa chọn. Các thành phần thường không có thứ tự được xác định trước về cách chúng nên lồng ghép. Nếu họ đã làm, bạn sẽ sử dụng kế thừa trực tiếp, thay vì các thành phần. Vì vậy, bạn nên thích giao diện để soạn một Decorator.

Tất cả những gì đã nói, đối số ban đầu của bạn cũng hợp lệ. Các thành phần trang trí (tính năng) có thể được hiểu như là một mối quan hệ nếu bạn thích; nhưng nó không phải là cách tự nhiên nhất để nhìn chúng.

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