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
Điều này có lẽ phù hợp hơn cho lập trình viên.stackexchange.com –
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. –
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. –