我正在尝试实现一个简单的应用程序,让我选择额外的汽车。每个额外的项目都是基类汽车的装饰器。
假设我执行以下操作
Car p = new FordFusion();
p = new ElectricWindows(p);
p = new LeatherSeatings(p);
p = new Airbags(p);然后我的对象p将是一辆带有电动车窗、真皮座椅和安全气囊的福特Fusion。
我需要让用户移除乱七八糟的装饰物,比如说,移除电动车窗而不移除皮革座椅和安全气囊
发布于 2011-10-07 10:27:28
我可能会用Chain of responsibility来解决这个问题。我将创建一个处理程序接口
public interface IAccessoryHandler
{
bool CanHandle( UserOption option ); // UserOption is an enum of Electric Window etc.
Handle( Car car );
}然后,我将创建处理程序实现,例如ElectricWindowHandler、LeatherHandler等,例如CanHandle() =>如果选项== UserOption.electric则处理() => car.Accessories.Add(新ElectricWindow);
每次用户更改选项时,我都会清除汽车配件集合,对选定的用户选项执行foreach操作,并让car对象遍历整个链。在链条过程结束时,你的车将拥有正确的配件。
发布于 2011-10-07 10:15:41
听起来像是装饰者模式可能不是对您的域进行建模的最佳方式。你的装饰者真的需要改变汽车的行为吗?或者它们只是增加了成本/价格?
您是否尝试过将ICarFeatures集合作为Car类的成员?ICarFeature可以有一个GetCost方法或类似的方法,以允许将汽车的总成本相加。
发布于 2011-10-07 10:10:31
可能有一个集中的对象,它会告诉你哪个模型的哪些特性已经被弃用,这样你就不必完全改变每个装饰器模式。我的意思是,在ElectricWindows返回Car对象之前,它会检查它是否有资格拥有这个特性。希望我说得有道理!!
https://stackoverflow.com/questions/7682408
复制相似问题