首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中删除乱序的装饰器

如何在C#中删除乱序的装饰器
EN

Stack Overflow用户
提问于 2011-10-07 10:07:01
回答 4查看 774关注 0票数 2

我正在尝试实现一个简单的应用程序,让我选择额外的汽车。每个额外的项目都是基类汽车的装饰器。

假设我执行以下操作

代码语言:javascript
复制
Car p = new FordFusion();
p = new ElectricWindows(p);
p = new LeatherSeatings(p);
p = new Airbags(p);

然后我的对象p将是一辆带有电动车窗、真皮座椅和安全气囊的福特Fusion。

我需要让用户移除乱七八糟的装饰物,比如说,移除电动车窗而不移除皮革座椅和安全气囊

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-07 10:27:28

我可能会用Chain of responsibility来解决这个问题。我将创建一个处理程序接口

代码语言:javascript
复制
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对象遍历整个链。在链条过程结束时,你的车将拥有正确的配件。

票数 0
EN

Stack Overflow用户

发布于 2011-10-07 10:15:41

听起来像是装饰者模式可能不是对您的域进行建模的最佳方式。你的装饰者真的需要改变汽车的行为吗?或者它们只是增加了成本/价格?

您是否尝试过将ICarFeatures集合作为Car类的成员?ICarFeature可以有一个GetCost方法或类似的方法,以允许将汽车的总成本相加。

票数 3
EN

Stack Overflow用户

发布于 2011-10-07 10:10:31

可能有一个集中的对象,它会告诉你哪个模型的哪些特性已经被弃用,这样你就不必完全改变每个装饰器模式。我的意思是,在ElectricWindows返回Car对象之前,它会检查它是否有资格拥有这个特性。希望我说得有道理!!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7682408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档