再谈组合模式

简介: 组合模式前面虽然已经学过了,可是那天给米老师讲这个模式发现自己理解的还是不够透彻,所以今天就再分析分析这个模式。组合模式是通过把对象组合成树形结构来表示“部分与整体”的层次结构,它使得用户对单个对象和组合对象的使用具有一致性。

组合模式前面虽然已经学过了,可是那天给米老师讲这个模式发现自己理解的还是不够透彻,所以今天就再分析分析这个模式。

组合模式是通过把对象组合成树形结构来表示“部分与整体”的层次结构,它使得用户对单个对象和组合对象的使用具有一致性。从这句话上来看,组合模式应该是事先把对象组合成树形结构,包括树枝节点和树叶节点。然后在对树枝节点和树叶节点进行统一的处理,使得用户对树枝节点和树叶节点的使用具有一致性。

在什么时候可以使用组合模式呢?当需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就可以使用组合模式了。也就是说首先对象的结构模式应该是树形结构,具有明确的树枝和树叶节点,而且从主观上可以忽略树枝和树叶的不同,可以统一的使用树枝和树叶,这个时候就应该使用组合模式。

还是用书上的例子说明:


实例中北京总公司、上海华东分公司、南京办事处、杭州办事处都是树枝节点;总公司人力资源部、总公司财务部、华东分公司人力资源部、华东分公司财务部、南京办事处人力资源部、南京办事处财务部、杭州办事处人力资源部、杭州办事处财务部都是树叶节点。其中总公司人力资源部与杭州办事处人力资源部都属于树叶节点,不同的是他们属于不同的树枝。总公司人力资源部属于总公司枝干,杭州办事处人力资源部属于杭州办事处枝干。但是它们都可以履行员工招聘培训管理的职责,这就是统一的使用组合结构中的所有对象。

但是我们假设没有各个树枝节点下没有人力部和财务部,那么杭州办事处和南京办事处就成为树叶节点。现在我们想要通过组合模式统一的为各个节点添加人力部和财务部是够可行?从理论上是不可行的,在叶节点中虽然也有Add和Remove,但是这只是为了达到叶节点和枝节点的一致性,叶节点本身不具备Add()、Remove方法。所以杭州办事处和南京办事处下面是不能在添加节点的,但是实际中有没有办法让各个公司和办事处一致的添加人力部和财务部呢?答案是肯定可以!但可能不是使用组合模式,人外有人天外有天,办法总是有的,只是自己现有水平可能还没办法解决,希望高手们指点!感谢!

目录
打赏
0
0
0
0
2
分享
相关文章
16.迭代器模式设计思想
本文详细介绍了迭代器模式的设计思想、原理、结构及应用场景,通过Java代码示例解析了迭代器模式的具体实现过程,并讨论了其优缺点及适用环境。迭代器模式通过提供统一的遍历接口,简化了集合对象的访问,支持多种遍历方式,同时保持了良好的封装性和灵活性。文章还提供了丰富的资源链接,帮助读者深入理解和应用设计模式。
70 7
11.组合模式设计思想
本文详细介绍了组合模式的设计思想和实现方法,涵盖组合模式的基础概念、实现步骤、实例演示、实现方式、优缺点分析等内容。通过具体的代码案例,展示了如何使用组合模式来处理具有层次结构的对象,如文件系统和购物清单,使客户端可以一致地处理单个对象和组合对象。文章还探讨了透明式和安全式组合模式的区别,并提供了设计建议和适用场景。适合初学者和有一定经验的开发者阅读。
70 3
Java设计模式【九】:组合模式
Java设计模式【九】:组合模式
69 0
【设计模式】适配器模式怎么理解?
【设计模式】适配器模式怎么理解?
75 1
再谈类与对象
前面两篇我们讲述了c++类和对象的相关知识,本篇将再讲述一些小的知识点
58 0
【设计模式】【第八章】【商品多级分类目录场景】【组合模式+访问者模式】
创建design-demo项目 创建ItemController 创建ItemService 创建ItemServiceimpl 创建ItemVisitor 创建DelItemVisitor 创建AddItemVisitor 创建ProductItem 创建AbstractProductItem 创建MockDb
133 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等