#引入一

文件夹对我们来说很熟悉,文件夹里面可以包含文件夹,也可以包含文件。

那么文件夹是个容器,文件夹里面的文件夹也是个容器,文件夹里面的文件是对象。

这是一个树形结构

咱们生活工作中常用的一种结构

文件是一个简单对象,我直接打开就可以使用。文件夹是复杂对象,因为里面还有子文件夹 或者是文件。

我在用这个文件夹的时候,我用相同的方式对待文件夹和文件。

其实这时候我们就是在使用设计模式中的组合模式了了

#引入二

这是从人家的博客上截的图

公司的组织架构也是常用的树形结构,也适合使用组合模式

#组合模式定义

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

#使用场景

1、想表示对象的部分-整体层次结构(树形结构)。

2、希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中

3‘如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择

#涉及角色

百度百科粘过来的

1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。

3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等

#组合模式的优点

组合模式的主要优点如下:

(1) 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。

(2) 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。

(3) 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。

(4) 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。

#组合模式的缺点

组合模式的主要缺点如下:

在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程较为复杂。

#组合模式有两种

(1) 透明组合模式

透明组合模式中,抽象构件Component中声明了所有用于管理成员对象的方法,包括add()、remove()以及getChild()等方法,这样做的好处是确保所有的构件类都有相同的接口。在客户端看来,叶子对象与容器对象所提供的方法是一致的,客户端可以相同地对待所有的对象。透明组合模式也是组合模式的标准形式。

透明组合模式的缺点是不够安全,因为叶子对象和容器对象在本质上是有区别的。叶子对象不可能有下一个层次的对象,即不可能包含成员对象,因此为其提供add()、remove()以及getChild()等方法是没有意义的,这在编译阶段不会出错,但在运行阶段如果调用这些方法可能会出错(如果没有提供相应的错误处理代码)。

 (2) 安全组合模式

安全组合模式中,在抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明并实现这些方法。这种做法是安全的,因为根本不向叶子对象提供这些管理成员对象的方法,对于叶子对象,客户端不可能调用到这些方法。

安全组合模式的缺点是不够透明,因为叶子构件和容器构件具有不同的方法,且容器构件中那些用于管理成员对象的方法没有在抽象构件类中定义,因此客户端不能完全针对抽象编程,必须有区别地对待叶子构件和容器构件。在实际应用中,安全组合模式的使用频率也非常高,在Java AWT中使用的组合模式就是安全组合模式。

#举个栗子 (python实现组合模式)

#抽象一个组织类
class Component:def __init__(self,name):self.name=namedef add(self,comp):passdef remove(slef,comp):passdef display(self,depth):pass#叶子节点
class Leaf(Component):def add(self):print('不能添加子节点')def remove(self):print('不能删除子节点')def display(self,depth):strtemp=''for i in range(depth):strtemp +='---'print(strtemp+self.name)#枝节点
class Composite(Component):def __init__(self,name):self.name=nameself.children=[]def add(self,comp):self.children.append(comp)def remove(self,comp):self.children.remove(comp)def display(self,depth):strtemp=''for i in range(depth):strtemp += '---'print(strtemp+self.name)for comp in self.children:comp.display(depth+2)if __name__=='__main__':root=Composite('根')root.add(Leaf('叶1a'))root.add(Leaf('叶1b'))root.add(Leaf('花1a'))root.add(Leaf('花1b'))comp1a=Composite('枝1a')comp1b=Composite('枝1b')root.add(comp1a)root.add(comp1b)comp1a.add(Leaf('叶2a'))comp1a.add(Leaf('叶2b'))comp1a.add(Leaf('花2a'))comp1a.add(Leaf('花2b'))comp2a=Composite('枝2a')comp1a.add(comp2a)comp1b.add(Leaf('叶2a'))comp1b.add(Leaf('花2a'))comp2a.add(Leaf('叶3a'))comp2a.add(Leaf('花3a'))comp3a=Composite('枝3a')comp2a.add(comp3a)comp3a.add(Leaf('叶4a'))comp3a.add(Leaf('花4a')) root.display(1)

参考

https://www.cnblogs.com/fxycm/p/4887680.html

https://baike.baidu.com/item/%E7%BB%84%E5%90%88%E6%A8%A1%E5%BC%8F/1441281

https://www.cnblogs.com/lfxiao/p/6816026.html

https://www.runoob.com/design-pattern/composite-pattern.html

https://www.jianshu.com/p/68ada9b3cff9

还有参考其他链接,忘记贴地址了

转载于:https://www.cnblogs.com/baxianhua/p/11350253.html

python 设计模式之组合模式Composite Pattern相关推荐

  1. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  2. C#设计模式——组合模式(Composite Pattern)

    一.概述 在软件开发中,我们往往会遇上类似树形结构的对象体系.即某一对象既可能在树形结构中作为叶节点存在,也可能作为分支节点存在.比如在文件系统中,文件是作为叶节点存在,而文件夹就是分支节点.在设计这 ...

  3. 设计模式:组合模式(Composite Pattern)

    组合模式: 又叫部分整体模式, 它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系. JDK中的HashMap就使用了组合模式 public abstra ...

  4. 设计模式之组合模式(Composite)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. [设计模式] 8 组合模式 Composite

    DP书上给出的定义:将对象组合成树形结构以表示"部分-整体"的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字"树形".这种树形结构在现实 ...

  6. 24组合模式(Composite Pattern)

    动机(Motivate):     组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元 ...

  7. 研磨设计模式 之 组合模式(Composite) 3——跟着cc学设计系列

    15.3  模式讲解 15.3.1  认识组合模式 (1)组合模式的目的 组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作. 实现这个目标的关键之处,是设计一 ...

  8. 研磨设计模式 之 组合模式(Composite) 2——跟着cc学设计系列

    15.2  解决方案 15.2.1  组合模式来解决 用来解决上述问题的一个合理的解决方案就是组合模式.那么什么是组合模式呢? (1)组合模式定义 (2)应用组合模式来解决的思路 仔细分析上面不用模式 ...

  9. 组合模式(Composite Pattern)

    组合模式概述 定义:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构.组合模式让客户端可以统一对待单个对象和组合对象.又被成为"部分-整体"(Part-Whole)模式, ...

最新文章

  1. 针对OAuth2的CSRF攻击
  2. HDU 1261 字串数
  3. binarytreenode”使用 类 模板 需要 模板 参数列表_c++1117 模板核心知识(一)—— 函数模板...
  4. 博客园首页博问闪存新随笔联系订阅管理 随笔- 252 文章- 0 评论- 45 HashPasswordForStoringInConfigFile中的Md5算法并非常用的Md5算法...
  5. 伪元素改变date类型input框的默认样式实例页面
  6. hp-socket 文本跟图片同时发送_文本、截图和应用,这样「包装」一秒变美观
  7. web 服务器和 web 技术发展历史简介
  8. 《Reids 设计与实现》第十二章 复制
  9. 自然语言处理的深度学习(各种书)
  10. 率土之滨显示未选择服务器怎么办,率土之滨未转服,为什么要转服
  11. yaf零基础学习总结7-学习使用Yaf中的插件
  12. linux开发之uboot移植 -- uboot简介
  13. [转载]Unicode、ANSI、UTF-8、Unicode Big Endian的故事
  14. 漏洞 立即留言_ASPCMS留言板漏洞注入一句话木马插入数据库及修复方法
  15. 音乐节奏提取matlab,音乐旋律提取算法 附可执行demo
  16. 有了它,Java语法也可以变得甜甜的
  17. 外汇套利原理及策略EA
  18. activeMQ启动失败61616port被占用问题
  19. 团队作业-Beta冲刺(3)
  20. c语言 调用 .cpp,C语言三方库的调用和编写

热门文章

  1. android 获取屏幕的宽和高
  2. hdu4814 黄金进制转换
  3. linux vim 粘贴 没有保持原来的格式,linux中的剪贴板用法,实现vim中原格式粘贴...
  4. DOM 精通了?请问 Node 和 Element 有何区别?
  5. ireport设置当前页面纸张大小格式:为何每次右键显示的可选项不一样
  6. 修改分值,总分不能超过100
  7. django mysql 修改密码_Django更改sqlite数据库使用mysql数据库 - 李金龙
  8. Httpd-2.2.0虚拟主机目录权限问题
  9. windows server上存储提示“由于管理员设置的策略,该磁盘处于脱机状态”
  10. 20个开源Flutter项目推荐