设计模式~合成模式
时间:2022-07-23
本文章向大家介绍设计模式~合成模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
合成模型模式(Composite)属于队形的结构模式,有时又叫做部分-整体模式(Part-Whole)。
合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。
合成模式可以使客户端将单纯元素与复合元素同等看待。
树
有向树结构的种类:
- 从上向下
- 从下向上
- 双向的
这里仅给出由上向下的示意图
一个树结构由两种节点组成:树枝节点和树叶节点。树枝节点可以有子节点,而一个树叶节点不可以有子节点。
在信息系统里,树枝节点所代表的构件常常用作树叶节点所代表的构件的容器。
合成模式
合成模式把部分和整体的关系用树结构表示出来。
从这个简略类图,可以看出,涉及三个角色:
- 抽象构件角色(Component),
- 树叶构件角色(Leaf),
- 树枝构件角色(Composite)
分成两类:
- 安全式的合成模式
- 透明式的合成模式
透明方式,
会在Component里面声明所有的用来管理子类对象的方法,包括 add(), remove() , 以及 getChild() 方法。
这样做的好处是所有的构件类都有相同的接口。客户端可以同等对待所有的对象。
缺点是不够安全,因为树叶类对象和合成对象在本质上是由区别的。
安全方法
安全方式,是在Composite 类里面声明所有的用来管理子类对象的方法。
这样的做法是安全的做法,因为树叶类型的对象根本就没有管理子类对象的方法,因此,如果客户端对树叶类对象使用这些方法时,程序会在编译时期出错。
缺点是,不够透明,因为树叶类和合成类将具有不同的接口。
安全式的合成模式
- 抽象构件角色(Component):这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。在安全式的合成模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝构件对象给出。
- 树叶构件角色(Leaf): 树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。
- 树枝构件角色(Composite): 代表参加组合的有下级子对象的对象。树枝构件类给出所有的管理子对象的方法,如 add(), remove() 以及 components()的声明。
代码清单:
Component
public interface Component {
/**
* 返还自己的实例
* @return
*/
Composite getComposite();
/**
* 某个商业方法
*/
void sampleOperation();
}
Composite
public class Composite implements Component {
private Vector componentVector = new Vector();
/**
* 返还自己的实例
*/
@Override
public Composite getComposite() {
// TODO Auto-generated method stub
return this;
}
/**
* 某个商业方法
*/
@Override
public void sampleOperation() {
Enumeration enumeration = components();
while(enumeration.hasMoreElements()){
((Component)enumeration.nextElement()).sampleOperation();
}
}
/**
* 聚集管理方法,增加一个子构件对象
* @param component
*/
public void add(Component component){
componentVector.addElement(component);
}
/**
* 聚集管理方法,删除一个子构件对象
* @param component
*/
public void remove(Component component){
componentVector.removeElement(component);
}
/**
* 聚集管理方法,返还聚集的Enumeration对象
* @return
*/
public Enumeration components(){
return componentVector.elements();
}
}
Leaf
public class Leaf implements Component {
/**
* 返还自己的实例
*/
@Override
public Composite getComposite() {
// TODO Auto-generated method stub
return null;
}
/**
* 某个商业方法
*/
@Override
public void sampleOperation() {
// TODO Auto-generated method stub
}
}
透明式的合成模式的结构
三个角色:
- JavaScript之面向对象学习四原型对象的动态性
- Apache顶级开源项目——机器学习库MADlib简介与应用实例
- 快速入门系列--WCF--06并发限流、可靠会话和队列服务
- 以太坊创始人或将卖掉所有以太坊,以太经典ETC才是未来
- SQL学习之HAVING过滤分组
- 快速入门系列--WCF--04元数据和异常处理
- linq to sql中慎用Where<T>(Func<TSource, bool> predicate),小心被Linq给"骗"了!
- 快速入门系列--WCF--03RESTFUL服务与示例
- SQL练习之不破坏应用程序现有查询的修改模式
- 快速入门系列--WCF--02消息、会话与服务寄宿
- JavaScript之面向对象学习二(原型属性对象与in操作符)获取对象中所有属性的方法
- 快速入门系列--深入理解C#
- “家庭贷款”域名Home.loans已经建站为家庭贷款相关的网站
- 微信亿级用户异常检测框架的设计与实践
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- apache下面二级目录部署react/vue的方法
- Linux下使用ip netns命令进行网口的隔离和配置ip地址
- Linux服务器操作系统加固方法
- linux NFS 服务安全加固方法
- CentOS 7.6安装MySQL 5.7 GA版的教程图解
- CentOS7.2 忘记root密码及重置root密码的简单处理方法
- Linux中文件描述符fd与文件指针FILE*互相转换实例解析
- Linux内核如何输出中文字符的方法示例
- Linux硬盘合并的实现代码
- 虚拟机Linux桥接模式下设置静态IP详解
- Linux平台安装redis及redis扩展的方法
- Linux环境下快速搭建ftp服务器方法介绍
- Linux通过匿名管道进行进程间通信
- shell判断一个变量是否为空方法总结
- 基于ubuntu16 Python3 tensorflow(TensorFlow环境搭建)