[英]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.