简易理解设计模式之:组合模式——实现View中的树状结构
介绍:
组合模式属于结构型模式。将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
类图:
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中的树状结构相关推荐
- 简易理解设计模式之:责任链模式——OA中请假流程示例
介绍: 责任链模式属于行为型设计模式.它的定义为:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,只到有对象处理它为止. 类图: ...
- 简易理解设计模式之:桥接模式——穿衣服经典案例2
介绍: 桥接模式属于结构型模式.它的定义为:将抽象部分与实现部分分离,使它们都可以独立的变化. 类图: Abstraction(抽象化角色):抽象部分,保持对实现部分对象的引用,抽象部分中的方法需要调 ...
- Java设计模式之组合模式详解
文章目录 详解Java设计模式之组合模式 案例引入 组合模式 定义 模式类图结构 相关角色 典型代码 案例分析 类图设计 实例代码 结果分析 JavaJDK中的组合模式 透明组合模式 安全组合模式 组 ...
- 设计模式:组合模式(Composite)
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- 研磨设计模式 之 组合模式(Composite) 3——跟着cc学设计系列
15.3 模式讲解 15.3.1 认识组合模式 (1)组合模式的目的 组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作. 实现这个目标的关键之处,是设计一 ...
- 每天一个设计模式之组合模式
作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...
- 1、【设计模式】组合模式
java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆] 树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...
- 详解设计模式:组合模式
组合模式(Composite Pattern),又叫部分整体模式,是 GoF 的 23 种设计模式中的一种结构型设计模式. 组合模式 是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组 ...
- 结构型设计模式之组合模式
结构型设计模式之组合模式 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创 ...
- 【设计模式】组合模式?建议改名叫树形模式!
什么是组合模式(Composite) 概念 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及 ...
最新文章
- ‘torch.nn‘ has no attribute ‘SiLU‘
- USB基础---Linux USB驱动层次
- spring源码分析之context
- 新消费风口再“热闹”,红利依然握在伊利、康师傅们手里
- html Selection
- 关于 SAP ABAP gateway OData 的一个诡异问题及解决办法
- 微信开发基础 获取用户OpenID 列表
- ifcfg-eth0 配置
- 提升你的开发效率,10 个 NPM 使用技巧
- wps java转换成doc_WPS能转PDF吗?WPS转换不能错过的一款软件!
- python dataframe 合并乱序列表_Python数据处理--删除重复项、数值替换和表合并
- WPS 2019使用技巧及WPS2019政府版最全合集
- winrar分卷压缩_无广告的WinRAR解压软件
- 条形码扫描模块的作用是什么?有什么应用意义?
- 如何使用Nginx Ingress实现灰度发布和蓝绿发布?
- 精选七条关于人工智能的经典语录
- 厦门大学,华中科技大学 再次牵手华为
- UEFI----EFI_DRIVER_BINDING_PROTOCOL
- Java并发编程工具类:CountDownLatch、CyclicBarrier、Semaphore
- JdbcTemplate – 调用存储过程
热门文章
- SpringBoot Spring Cloud项目学习汇总
- iview中Cascader组件的坑
- echarts三维建筑地图注解
- 最优化算法---可行方向之Frank-wolfe 方法(求解非线性规划问题)
- 广州市二手房源数据采集和可视化分析(链家二手房)Python
- 安装 配置BlackBerry Push Service SDK v1.1.0
- 【量子机器学习】HHL算法: Quantum algorithm for solving linear systems of equations
- Windows窗口程序
- 计算机工作记录,电脑上可以记录每日工作内容的办公便签是什么?
- cd linux安装到u盘,安装 CDLinux 到移动硬盘或U盘