2013-04-18 95 views
5

此線程Decorator pattern implementation具有使用抽象類的裝飾器的實現。我不喜歡這樣一個簡單的事實,那就是CondimentDecorator在那裏的實施中不是飲料。我會使用接口。不是抽象類更好的是 - 關係,更好的接口 - 關係?C#裝飾器 - 接口或抽象類?

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

這可能是一個更適合程序員.stackexchange.com –

+0

我完全同意,但這不是你指的問題的重點。 –

+2

是的,把你的唯一的基類放在一個不是一個關係的東西上是一個壞主意。 –

回答

3

這兩個基礎類和接口經常用於建模is-a關係。即使像IDisposable這樣簡單的界面也可以被理解爲「具有手動控制生命週期的對象」,「一次性」。更明確的區別在於是否允許基礎實施或數據字段;並能夠結合多個層次。

現在,當您實施任何模式時,您通常都有足夠的信息來查看您是否需要數據字段。但是,您幾乎無法排除未來需要將軟件增加的其他模式引入相同的類。從這個角度來看,接口相對於抽象類的一般偏好爲您提供更長期的靈活性 - 無論何時您有選擇。

由裝飾者的性質,你有一個選擇。組件通常沒有預定義的嵌套順序。如果他們這樣做,你會直接使用繼承,而不是組件。所以你應該更喜歡界面組成一個裝飾者。

所有這一切,你的原始論點也是有效的。裝飾者組件(特徵)可以被理解爲是 - 如果你喜歡的話就是一種關係;但它並不是看待它們的最自然的方式。