介绍:

组合模式属于结构型模式。将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

类图:


Component(抽象组件角色):为组合中的对象声明接口
Composite(树枝节点):树枝节点有子节点,用来存储子部件
Leaf(叶子节点):叶子节点没有子节点

用法:
• 表示对象的部分-整体层次结构时
• 从一个整体中能够独立出部分模块或功能的场景

个人理解:


组合模式本质就是树状结构算法的实现,它强调出部分与整体的层次结构,并且叶子节点和树枝节点都必须实现相同的接口。例如目录结构、文件夹结构、公司组织结构等都是组合模式的一个应用。

例子:
在GUI开发中,有些视图控件可以添加其它子视图(ViewGroup),而有些却不能添加(View)。ViewGroup与View在GUI开发中是很经典也很常用的组合模式。

需求:模拟View的实现

1、模拟View结构的实现(第一版代码)

1.1、创建抽象组件接口

public abstract class View {protected List<View> mViews = new ArrayList<>();protected String name;public View(String name){this.name = name;}public abstract void addView(View view);public abstract void removeView(View view);public abstract void printViews(String placeholder);
}

定义了三个抽象方法,分别让叶子节点和树枝节点实现该方法。

1.2、创建叶子节点ContentView

public class ContentView extends View {public ContentView(String name) {super(name);}@Overridepublic void addView(View view) {throw new UnsupportedOperationException("不支持此操作");}@Overridepublic void removeView(View view) {throw new UnsupportedOperationException("不支持此操作");}@Overridepublic void printViews(String placeholder) {System.out.println(placeholder + "--" + name);}
}

叶子节点作为整个树状结构的最小单元,并没有添加和删除子View的方法。

1.3、创建树枝节点ViewGroup

public class ViewGroup extends View {public ViewGroup(String name) {super(name);}@Overridepublic void addView(View view) {mViews.add(view);}@Overridepublic void removeView(View view) {mViews.add(view);}@Overridepublic void printViews(String placeholder) {System.out.println(placeholder + "└──" + name);for (View view : mViews) {view.printViews(placeholder+ "   ");}}
}

树枝节点能够删除添加叶子或树枝,实现了添加和删除的方法。

1.4、使用和结果

public class Client {public static void main(String[] args) {//根节点View rootView = new ViewGroup("LinerLayout");//第一层-枝干节点View frameLayout = new ViewGroup("FrameLayout");//第二层-叶子节点View button = new ContentView("Button");View label = new ContentView("Label");//第一层-叶子节点View textView = new ContentView("TextView");rootView.addView(frameLayout);rootView.addView(textView);frameLayout.addView(button);frameLayout.addView(label);rootView.printViews("");}
}
└──LinerLayout└──FrameLayout--Button--Label--TextView

上面的例子中我们基本实现了需求。我们可以发现,叶子节点不需要添加和删除的方法,却也同样实现了抽象方法。这种方式,将使用的方法放到抽象类中,不管叶子对象还是树枝对象都有相同的结构,成为透明组合模式。

2、优化View结构的实现(第二版代码)

在我们使用透明组合模式的时候,我们发现属于叶子节点的ContentView并不需要实现如此多的方法。在组合模式有两种不同的实现,分别为透明组合模式和安全组合模式。

2.1、优化View

public abstract class View {protected String name;public View(String name){this.name = name;}public abstract void printViews(String placeholder);}

抽象方法中,将控制子View的方法放在ViewGorup中。

2.2、优化ContentView

public class ContentView extends View {public ContentView(String name) {super(name);}@Overridepublic void printViews(String placeholder) {System.out.println(placeholder + "--" + name);}
}

ContentView只实现自己需要用到的方法。

2.3、优化ViewGroup

public class ViewGroup extends View {protected List<View> mViews = new ArrayList<>();public ViewGroup(String name) {super(name);}public void addView(View view) {mViews.add(view);}public void removeView(View view) {mViews.add(view);}@Overridepublic void printViews(String placeholder) {System.out.println(placeholder + "└──" + name);for (View view : mViews) {view.printViews(placeholder+ "   ");}}
}

ViewGroup控制了子View的增删操作。

2.4、客户端代码

public class Client {public static void main(String[] args) {//根节点ViewGroup rootView = new ViewGroup("LinerLayout");//第一层-枝干节点ViewGroup frameLayout = new ViewGroup("FrameLayout");//第二层-叶子节点ContentView button = new ContentView("Button");ContentView label = new ContentView("Label");//第一层-叶子节点ContentView textView = new ContentView("TextView");rootView.addView(frameLayout);rootView.addView(textView);frameLayout.addView(button);frameLayout.addView(label);rootView.printViews("");}
}

把树枝节点和叶子节点的行为彻底分开,树枝节点单独拥有用来组合的方法,这种方式就是安全组合模式了。

总结:
此模式本质就是树状结构,在具有明显的层次结构时使用;组合模式分为安全组合模式和透明组合模式,各有特点按实际开发需求斟酌使用。

感谢您的阅读~

推荐阅读

基础篇:
设计模式前篇之——UML类图必会知识点
设计模式前篇之——一起过一下面向对象的概念
创建型模式:
简易理解设计模式之:简单工厂模式——来试试接入支付功能
简易理解设计模式之:工厂方法模式——数据存储例子
简易理解设计模式之:抽象工厂模式——更换数据库例子
简易理解设计模式之:建造者模式——学习使用“链式调用”
简易理解设计模式之:原型模式——深、浅拷贝的概念
简易理解设计模式之:单例模式——单例模式的几种常用写法
结构型模式:
简易理解设计模式之:适配器模式——Android列表视图控件设计方式
简易理解设计模式之:桥接模式——穿衣服经典案例2
简易理解设计模式之:组合模式——实现View中的树状结构
简易理解设计模式之:装饰模式——穿衣服经典案例
简易理解设计模式之:外观模式——第三方SDK的帮助类
简易理解设计模式之:享元模式——五子棋游戏例子
简易理解设计模式之:代理模式——iOS视图控件设计方式
行为型模式:
简易理解设计模式之:策略模式——优化一下支付功能
简易理解设计模式之:模板方法模式——Android中的BaseActivity基类
简易理解设计模式之:观察者模式——监听与回调
简易理解设计模式之:状态模式——优化登录操作
简易理解设计模式之:备忘录模式——Word文档的工作原理
简易理解设计模式之:迭代器模式——遍历对象的好帮手
简易理解设计模式之:命令模式——实现命令的参数化配置
简易理解设计模式之:责任链模式——OA中请假流程示例
简易理解设计模式之:中介者模式——多人聊天室例子
简易理解设计模式之:解释器模式——语言和文法
简易理解设计模式之:访问者模式——员工考核例子

简易理解设计模式之:组合模式——实现View中的树状结构相关推荐

  1. 简易理解设计模式之:责任链模式——OA中请假流程示例

    介绍: 责任链模式属于行为型设计模式.它的定义为:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止. 类图: ...

  2. 简易理解设计模式之:桥接模式——穿衣服经典案例2

    介绍: 桥接模式属于结构型模式.它的定义为:将抽象部分与实现部分分离,使它们都可以独立的变化. 类图: Abstraction(抽象化角色):抽象部分,保持对实现部分对象的引用,抽象部分中的方法需要调 ...

  3. Java设计模式之组合模式详解

    文章目录 详解Java设计模式之组合模式 案例引入 组合模式 定义 模式类图结构 相关角色 典型代码 案例分析 类图设计 实例代码 结果分析 JavaJDK中的组合模式 透明组合模式 安全组合模式 组 ...

  4. 设计模式:组合模式(Composite)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

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

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

  6. 每天一个设计模式之组合模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

  7. 1、【设计模式】组合模式

    java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...

  8. 详解设计模式:组合模式

    组合模式(Composite Pattern),又叫部分整体模式,是 GoF 的 23 种设计模式中的一种结构型设计模式. 组合模式 是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组 ...

  9. 结构型设计模式之组合模式

    结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...

  10. 【设计模式】组合模式?建议改名叫树形模式!

    什么是组合模式(Composite) 概念 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及 ...

最新文章

  1. ‘torch.nn‘ has no attribute ‘SiLU‘
  2. USB基础---Linux USB驱动层次
  3. spring源码分析之context
  4. 新消费风口再“热闹”,红利依然握在伊利、康师傅们手里
  5. html Selection
  6. 关于 SAP ABAP gateway OData 的一个诡异问题及解决办法
  7. 微信开发基础 获取用户OpenID 列表
  8. ifcfg-eth0 配置
  9. 提升你的开发效率,10 个 NPM 使用技巧
  10. wps java转换成doc_WPS能转PDF吗?WPS转换不能错过的一款软件!
  11. python dataframe 合并乱序列表_Python数据处理--删除重复项、数值替换和表合并
  12. WPS 2019使用技巧及WPS2019政府版最全合集
  13. winrar分卷压缩_无广告的WinRAR解压软件
  14. 条形码扫描模块的作用是什么?有什么应用意义?
  15. 如何使用Nginx Ingress实现灰度发布和蓝绿发布?
  16. 精选七条关于人工智能的经典语录
  17. 厦门大学,华中科技大学 再次牵手华为
  18. UEFI----EFI_DRIVER_BINDING_PROTOCOL
  19. Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore
  20. JdbcTemplate – 调用存储过程

热门文章

  1. SpringBoot Spring Cloud项目学习汇总
  2. iview中Cascader组件的坑
  3. echarts三维建筑地图注解
  4. 最优化算法---可行方向之Frank-wolfe 方法(求解非线性规划问题)
  5. 广州市二手房源数据采集和可视化分析(链家二手房)Python
  6. 安装 配置BlackBerry Push Service SDK v1.1.0
  7. 【量子机器学习】HHL算法: Quantum algorithm for solving linear systems of equations
  8. Windows窗口程序
  9. 计算机工作记录,电脑上可以记录每日工作内容的办公便签是什么?
  10. cd linux安装到u盘,安装 CDLinux 到移动硬盘或U盘