c#装饰器模式多个属性包装多次

问题描述

编辑:第一个回应是关闭链接。我访问了该链接,但它没有回答我的问题。它使用了方法而不是属性的示例。此外,它显示包装 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 (将#修改为@)