微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。