扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
二、结构图
上图中,也可以做些扩展,根据需要可以将Leaf和Composite做为抽象基类,从中派生出子类来。
三、优缺点
优点:对于Composite模式,也许人们一开始的注意力会集中在它是如何实现组合对象的。但Composite最重要之处在于用户并不关心是组合对象还是单个对象,用户将以统一的方式进行处理,所以基类应是从单个对象和组合对象中提出的公共接口。
缺点:Composite最大的问题在于不容易限制组合中的组件。
四、实现
有时需要限制组合中的组件,即希望一个Composite只能有某些特定的Leaf。这个问题我是用多继承和动态类型转换来解决的。假如组合对象Composite1只能包含单个对象ConcreteLeaf1,Composite2可以包含单个对象ConcreteLeaf1和ConcreteLeaf2。如下图所示:
上图中的类层次比较多,使用了AbstractLeaf1和AbstractLeaf2,但没使用AbstractComposite1和AbstractComposite2,这个并不重要,也可以把AbstractLeaf1和AbstractLeaf2去掉,这个并不重要,可以根据具体情况决定要不要。
简单的代码实现如下:
namespace DesignPattern_Composite class AbstractComponent1 : virtual public Component {} ; class AbstractLeaf1 : virtual public AbstractComponent1 {} ; class Composite1 : public AbstractComponent1 class AbstractComponent2 : virtual public Component {} ; class AbstractLeaf2 : virtual public AbstractComponent2 {} ; class Composite2 : public AbstractComponent2 class ConcreteLeaf1 : public AbstractLeaf1 class ConcreteLeaf2 : public AbstractLeaf1, public AbstractLeaf2 客户端代码: Component *pc1 = new ConcreteLeaf1() ; |
有两点需要注意,一是因为用了多继承,所以需要使用virtual inheritance。二是要用dynamic_cast来判断是否允许组合该组件。
五、示例代码
namespace DesignPattern_Composite // class Leaf // class Composite |
六、实例
(1)JUnit中就用的是Composite模式。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者