组合模式/composite模式/对象结构型模式
组合模式/composite模式/对象结构型
意图
将对象组合成树形结构以表示“整体——部分”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
动机
Composite模式,关键是一个抽象类(组件),既可以代表对象(叶子节点),又可以代表组合(中间节点)。使用组合模式,我们能把相同的操作应用到组合和个别对象上。
通过让组件包含管理子节点和叶节点的操作,换取了对客户的透明性。
透明性和安全性的抉择
组合模式,使得用户对叶子节点和中间节点一视同仁,但是用户可以叶子节点进行只有中间节点才有的操作,有失安全性。
在具体实现组合模式时,可以在抽象类或结构中,默认提供“不可操作”的方法,子类不重写,即不可使用。
java实现要素:组件(component)+组合(composite)+树(结构)
- 组件,是接口定义,组合要实现组件(无论组合是否为叶子)。
- 组合是对组件的实现,组件的实现有两种:组合和叶节点。组合有孩子,孩子既可以是组合,又可以是叶节点;叶子节点为末尾节点,不可以有孩子。
- 通过组合+叶节点,实现一个树形的结构。
代码实现
/**
* 组件接口,为组合中所有对象定义接口,无论是组合还是叶子。
* 并且添加了一些默认行为。
*/
public interface Component {
void operation();
default void add(Component component){
throw new RuntimeException("不支持此操作");
}
default void remove(Component component){
throw new RuntimeException("不支持此操作");
}
default List<Component> getChildren(){
throw new RuntimeException("不支持此操作");
}
}
/**
* 定义组件的行为,这种组件具有子节点
*
*/
public class Composite implements Component {
List<Component> children = new ArrayList<>();
@Override
public synchronized void operation() {
getChildren().forEach(s -> s.operation());
}
@Override
public synchronized void add(Component component) {
children.add(component);
}
@Override
public synchronized void remove(Component component) {
children.remove(component);
}
@Override
public List<Component> getChildren() {
return children;
}
}
/**
* 定义叶子节点操作,定义组合内的元素行为。
* 对于叶子节点,增删改节点操作没有意义。
*
*/
public class Leaf implements Component{
@Override
public void operation() {
System.out.println("这是叶子"+UUID.randomUUID());
}
}
//测试
public class Test {
public static void main(String[] args) {
Composite root = new Composite();
root.add(new Leaf());
root.add(new Leaf());
Composite compX = new Composite();
compX.add(new Leaf());
compX.add(new Leaf());
root.add(compX);
Composite compXY = new Composite();
compXY.add(new Leaf());
compXY.add(new Leaf());
compX.add(compXY);
root.operation();
}
}

JDK中的迭代器模式
让使用者把单独的对象和组合对象混用
javax.swing.JComponent#add(Component)
java.awt.Container#add(Component)
java.util.Map#putAll(Map)
java.util.List#addAll(Collection)
java.util.Set#addAll(Collection)
组合模式/composite模式/对象结构型模式的更多相关文章
- 桥接模式(bridge pattern)-------结构型模式
桥接模式是一种对象结构型模式,其将抽象部分和它的实现部分分离,使它们都可以独立的变化,又称为柄体(Handle and Body)模式或接口(Interface)模式. 优点: 1.分离抽象接口及其实 ...
- OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式
前言 前面我们学习了创建型设计模式,其中有5中,个人感觉比较重要的是工厂方法模式.单例模式.原型模式.接下来我将分享的是结构型模式! 一.适配器模式 1.1.适配器模式概述 适配器模式(Adapter ...
- ANDROID 中设计模式的採用--结构型模式
结构型模式中的适配器模式.外观模式.装饰模式.代理模式都属于包装模式,都是对另外的类或对象的包装,仅仅是各自的意图不同. 适配器模式通过对另外的类或对象的包装,将其接口转换为用户期 ...
- Composite(组合)--对象结构型模式
1.意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.动机 可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成 ...
- 设计模式学习之桥接模式(Bridge,结构型模式)(15)
参考地址:http://terrylee.cnblogs.com/archive/2006/02/24/336652.html 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化, ...
- 外观模式(Facade)---结构型模式
1 基础知识 定义:提供了一个统一的接口(外观类),用来访问子系统中的一群接口.特征:定义了一个高层接口让子系统更容易使用,减少了外部与子系统内多个模块的耦合. 本质:封装交互,简化调用. 优点:简化 ...
- Decorator(装饰)-对象结构型模式
1.意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器 Wrapper. 3.动机 给某个对象而不是整个类添加一些功能.一个较为灵 ...
- Bridge(桥接)-对象结构型模式
1.意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 2.动机 在抽象类与它的实现之间起到桥梁作用,使它们可以独立地变化. 3.适用性 不希望在抽象和它的实现部分之间有一个固定的绑定关系. ...
- Facade(外观)-对象结构型模式
1.意图 为子系统中的一组接口提供一个一致的接口,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 2.动机 将一个系统划分成若干子系统有利于降低系统的复杂性.一个常见的设计目 ...
随机推荐
- JDK Collection 源码分析(3)—— Queue
@(JDK)[Queue] JDK Queue Queue:队列接口,对于数据的存取,提供了两种方式,一种失败会抛出异常,另一种则返回null或者false. 抛出异常的接口:add,remove ...
- 【10-25】intelliji ide 学习笔记
快捷键 /** alter+enter 导包,异常处理等提示 psvm 快速main函数 sout 快速sysout语句 fi 快速for循环 ctrl+d 重复一行 Ctrl+X 删除行 Ctrl+ ...
- 如何设置tomcat定时自动重启
,今天笔者就跟大家分享一下如何设置tomcat定时自动重启. 第一:把Tomcat6安装成windows 2003服务. 1.首先检查tomcat\bin目录下是否有service.bat文件,如图: ...
- HttpCache缓存扩展方法
using System;using System.Collections;using System.Configuration;using System.Web;using System.Web.C ...
- 多个文件下载打包生成zip格式下载
这个多个文件下载生成zip格式必须先引用一个ICSharpCode.SharpZipLib.dll. 代码如下 //将多个文件打包成压缩文件zip格式下载 protected voi ...
- 关于es5的一些新方法
1.数组方法(1)isArray在之前我们判断数组类型的数据都是用instanceof来判断的,es5新增了对数组的判断,即Array.isArray()(2)every和some这两个方法一般用于对 ...
- JS学习:第二周——NO.3盒子模型
1.CSS盒子模型包括四个部分组成:设定的宽高+padding+border+margin: 2.JS盒子模型:通过系统提供的属性和方法,来获取当前元素的样式值 JS提供的属性和方法: clien ...
- 关于linux下system()函数的总结
导读 曾经的曾经,被system()函数折磨过,之所以这样,是因为对system()函数了解不够深入.这里必须要搞懂system()函数,因为有时你不得不面对它. 先来看一下system()函数的简单 ...
- maven 配置问题
① 错误 Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver' 原因:pom.xml文件下载ojdbc14-10.2.0.3. ...
- 面向对象Part3
继承: Extends在英文中的翻译是拓展. 但是java允许多重继承. 一条线.单线. ------------------------------------------------------- ...