簡體   English   中英

C#裝飾器 - 接口或抽象類?

[英]C# Decorators - Interfaces or Abstract Classes?

這個線程, Decorator模式實現 ,有一個使用抽象類的裝飾器的實現。 我不喜歡它的簡單事實,即CondimentDecorator不是那里給出的實施中的飲料。 我會使用接口代替。 對於is-a關系而言,抽象類不是更好嗎?對於has-a關系,接口更好嗎?

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

基礎clases和接口經常用於建模is-a關系。 甚至像IDisposable這樣簡單的界面也可以理解為“是具有手動控制生命周期的對象”,“一次性”。 更切實的區別在於是否允許基本實現或數據字段; 以及他們組合多個層次結構的能力。

現在,當您實現任何模式時,通常都有足夠的信息來查看是否需要數據字段。 但是,隨着軟件的發展,您幾乎無法排除未來需要在其他模式中使用相同的類。 從這個角度來看,接口對抽象類的一般偏好為您提供了更長期的靈活性 - 只要您有選擇。

根據裝飾者的性質,您可以選擇。 組件通常沒有預定義的嵌套方式。 如果他們這樣做,你將直接使用繼承,而不是組件。 所以你應該更喜歡接口來組成一個Decorator。

總而言之,你的原始論點也是有效的。 裝飾器組件(功能)可以理解為 - 如果你喜歡的話,就是一種關系; 但它不是最自然的看待它們的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM