问题描述
编辑:第一个回应是关闭链接。我访问了该链接,但它没有回答我的问题。它使用了方法而不是属性的示例。此外,它显示包装 1 次。我正在尝试多次。也许那里有更好的例子或帖子,但我没有找到。
试图理解装饰器模式。我的定义是它的目的是“动态地将额外的责任附加到一个对象上。装饰器提供了一个灵活的替代子类来扩展功能”。查看了大量示例,通常所有装饰器中都会覆盖一些虚拟方法,所以我可能会以错误的方式解决这个问题。我正在尝试添加属性。代码似乎创建了包装对象的层次结构,但我不了解属性的获取和设置。如果我在装饰后立即设置它们,然后访问它们,它们是可用的。
示例是一辆自行车。基础自行车具有颜色和尺寸。我希望能够通过用不同的装饰器组合包裹自行车来添加可选踏板和/或可选前悬架和/或可选后悬架,然后能够访问所有自行车,前悬架,后悬架,和踏板属性。所以自行车被多次“装饰”(或用正确的术语包装?)。我试图避免为所有不同的选项组合创建创建类。提前致谢。
在这段代码中,错误发生在 Main() 方法的最后一条语句中。
void Main()
{
IBicycle mountainBike=new Bicycle();
mountainBike=new FrontSuspensionoption(mountainBike);// decorate with front suspension
mountainBike=new RearSuspensionoption(mountainBike); // decorate with rear suspension
mountainBike=new PedalOption(mountainBike);// decorate with optional pedals
// assign properties
mountainBike.Color="Black";
mountainBike.Size="Medium";
// trying to assign Front suspension
mountainBike.FrontSuspension="RockShox"; // error,but works if the property is assigned
// immediately after wrapping?
}
public interface IBicycle
{
string Size{get; set;}
string Color{get; set;}
}
public class Bicycle : IBicycle
{
public Bicycle(){}
public string Size{get; set;}
public string Color{get; set;}
}
public abstract class BicycleDecorator : IBicycle
{
private IBicycle decoratedBicycle;
protected BicycleDecorator(IBicycle bicycle)
{
decoratedBicycle=bicycle;
}
protected IBicycle DecoratedBicycle{get; private set;}
public string Size{get; set;}
public string Color{get; set;}
}
public class FrontSuspensionoption:BicycleDecorator
{
public FrontSuspensionoption(IBicycle bicycle):base(bicycle){}
string FrontSuspension {get; set;}
}
public class RearSuspensionoption:BicycleDecorator
{
public RearSuspensionoption(IBicycle bicycle):base(bicycle){}
string RearSuspension {get; set;}
}
public class PedalOption:BicycleDecorator
{
public PedalOption(IBicycle bicycle):base(bicycle){}
string Pedal {get; set;}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)