Design patterns 组合策略与组合模式

Design patterns 组合策略与组合模式,design-patterns,composite,strategy-pattern,Design Patterns,Composite,Strategy Pattern,我想在我的软件中结合两种设计模式。我首先创建了一个复合模式,对我的业务问题进行建模 这样,我就可以很好地建模问题的结构,并创建一个对象树。 我想在此基础上运行一些业务逻辑(比如执行函数,它返回许多元素)。但该算法需要在较高级别上进行调整。ie我希望能够更改图片中显示的所有类的执行函数 我正在寻找一些有用的文档和/或提示!有什么想法吗?设计模式通常是结合在一起的。我认为,事实上,大多数模式书都分别展示了每一种模式,这对了解它们的人来说是一种误导 您的示例有点模糊,因此很难完全理解您的意思,但是我

我想在我的软件中结合两种设计模式。我首先创建了一个复合模式,对我的业务问题进行建模

这样,我就可以很好地建模问题的结构,并创建一个对象树。 我想在此基础上运行一些业务逻辑(比如执行函数,它返回许多元素)。但该算法需要在较高级别上进行调整。ie我希望能够更改图片中显示的所有类的执行函数


我正在寻找一些有用的文档和/或提示!有什么想法吗?

设计模式通常是结合在一起的。我认为,事实上,大多数模式书都分别展示了每一种模式,这对了解它们的人来说是一种误导


您的示例有点模糊,因此很难完全理解您的意思,但是我认为将
execute()
函数分解为一个单独的接口,将其转化为策略,并允许将该策略注入类a(组合的根)是一种解决方案。然后,类A可以将该策略注入正在合成的其他对象。

我看不到一种合成模式能够很好地处理作为不共享共同祖先的异构类型对象的组件。您需要所有组件继承某种类型的
Component
类,可能带有
Composite
Leaf
子类来指定叶和节点的一般行为

A如何知道在C/E中注入什么?它只知道它有 “概念类”的孩子

A不应该知道它有“概念类”的子类。它应该只知道它有
组件
子项。C和E是那些知道自己属于“概念类”的人。根据您的语言,C和E的这种双重性质可能很难实现(没有多重继承等)


您能否详细说明
E类
C类
源自“概念超类”这一事实是如何干扰整个复合/执行()策略的?没有这些知识,很难推荐任何东西。

谢谢你的回复!我知道它含糊不清,另一个选项是解释业务问题,这带来了其他麻烦:-)好吧,假设我在a中注入一个策略,a注入它的子代。A如何知道在C/E中注入什么?它只知道它有“概念类”的子类。现在我意识到我的图表令人困惑。最好在A和“概念类”之间建立聚合关系,并删除C和E的聚合。我说得通吗?谢谢你的回答。让我简单地解释一下:1)树结构是为了模拟一个“房子”,根是一个房子对象。它包含屋顶、地板和墙类型的子对象。2) 墙可以用各种方式来实现:它可以建模得更一般(长x宽x高,仅此而已)(E类),或者以后可以实现得更详细(墙中有几排砖……)(C类)3)计算我的房子的价格需要策略,因为我想能够切换计算方法。因此:一种策略计算墙壁的数量可能与另一种策略不同。如果墙壁不会改变价格计算策略的任何内容,则可以让a类将该策略传递给其组件(
HouseComponent
s?),而不管它们是墙、地板、屋顶,等等。如果墙确实改变了策略中的价格计算逻辑,那么您可能需要另一种模式(访客?)完整房屋的价格计算策略,包括其包含组件的所有较小计算。我设想在execute of House中,将迭代墙列表,并在每个墙上调用execute。知道这一点,您还会使用访问者模式吗?此外,我希望能够扩展该策略。在一般策略中,房子的价格被称为,它可以计算每面墙1美元的工程/设计成本。但随后我把房子扩展到了阶级幻想屋,把策略扩展到了calcFancyHouse。这个计算和它的祖先一样,但是每面墙增加1美元。访客模式似乎是解决方案。我应该先用谷歌搜索一下:-)谢谢!