组合模式/composite模式/对象结构型模式

时间:2022-01-26 19:01:25

组合模式/composite模式/对象结构型

意图

将对象组合成树形结构以表示“整体——部分”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

动机

Composite模式,关键是一个抽象类(组件),既可以代表对象(叶子节点),又可以代表组合(中间节点)。使用组合模式,我们能把相同的操作应用到组合和个别对象上。

通过让组件包含管理子节点和叶节点的操作,换取了对客户的透明性。

透明性和安全性的抉择

组合模式,使得用户对叶子节点和中间节点一视同仁,但是用户可以叶子节点进行只有中间节点才有的操作,有失安全性。

在具体实现组合模式时,可以在抽象类或结构中,默认提供“不可操作”的方法,子类不重写,即不可使用。

java实现要素:组件(component)+组合(composite)+树(结构)

  1. 组件,是接口定义,组合要实现组件(无论组合是否为叶子)。
  2. 组合是对组件的实现,组件的实现有两种:组合和叶节点。组合有孩子,孩子既可以是组合,又可以是叶节点;叶子节点为末尾节点,不可以有孩子。
  3. 通过组合+叶节点,实现一个树形的结构。

代码实现

/**
* 组件接口,为组合中所有对象定义接口,无论是组合还是叶子。
* 并且添加了一些默认行为。
*/
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();
}
}

组合模式/composite模式/对象结构型模式

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模式/对象结构型模式的更多相关文章

  1. 桥接模式(bridge pattern&rpar;-------结构型模式

    桥接模式是一种对象结构型模式,其将抽象部分和它的实现部分分离,使它们都可以独立的变化,又称为柄体(Handle and Body)模式或接口(Interface)模式. 优点: 1.分离抽象接口及其实 ...

  2. OOAD-设计模式(四)结构型模式之适配器、装饰器、代理模式

    前言 前面我们学习了创建型设计模式,其中有5中,个人感觉比较重要的是工厂方法模式.单例模式.原型模式.接下来我将分享的是结构型模式! 一.适配器模式 1.1.适配器模式概述 适配器模式(Adapter ...

  3. ANDROID 中设计模式的採用--结构型模式

            结构型模式中的适配器模式.外观模式.装饰模式.代理模式都属于包装模式,都是对另外的类或对象的包装,仅仅是各自的意图不同. 适配器模式通过对另外的类或对象的包装,将其接口转换为用户期 ...

  4. Composite(组合)--对象结构型模式

    1.意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.动机 可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成 ...

  5. 设计模式学习之桥接模式(Bridge,结构型模式)(15)

    参考地址:http://terrylee.cnblogs.com/archive/2006/02/24/336652.html 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化, ...

  6. 外观模式(Facade)---结构型模式

    1 基础知识 定义:提供了一个统一的接口(外观类),用来访问子系统中的一群接口.特征:定义了一个高层接口让子系统更容易使用,减少了外部与子系统内多个模块的耦合. 本质:封装交互,简化调用. 优点:简化 ...

  7. Decorator&lpar;装饰)-对象结构型模式

    1.意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器 Wrapper. 3.动机 给某个对象而不是整个类添加一些功能.一个较为灵 ...

  8. Bridge(桥接)-对象结构型模式

    1.意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 2.动机 在抽象类与它的实现之间起到桥梁作用,使它们可以独立地变化. 3.适用性 不希望在抽象和它的实现部分之间有一个固定的绑定关系. ...

  9. Facade(外观)-对象结构型模式

    1.意图 为子系统中的一组接口提供一个一致的接口,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 2.动机 将一个系统划分成若干子系统有利于降低系统的复杂性.一个常见的设计目 ...

随机推荐

  1. poi导出word、excel

    在实际的项目开发中,经常会有一些涉及到导入导出的文档的功能.apache开源项目之一poi对此有很好的支持,对之前的使用做一些简要的总结. 1,导入jar 为了保证对格式的兼容性,在项目的pom.xm ...

  2. 新版macbook air OS X El Capitan 10&period;11安装WIN找不到驱动介质???

    这个问题已经解决 首先进入Boot Camp6 以后 顶上会有一个操作 -下载windowns 驱动程序 保存在优盘里面.然后再分区选择ISO(中间和你前面做的一样)电脑重启进入WIN安装 到你们出现 ...

  3. Saltstack异步执行命令(十三)

    Saltstack异步执行命令 salt执行命令有时候会有超时的问题,就是命令下发下去了,部分主机没有返回信息,这时候就很难判断命令或任务是否执行成功.因此,salt提供异步执行的功能,发出命令后立即 ...

  4. oracle解析xml&lpar;增加对9i版本的支持&rpar;

    --方法1  SELECT * FROM  XMLTABLE('$B/DEAL_BASIC/USER_DEAL_INFO' PASSING     XMLTYPE('<?xml version= ...

  5. 遍历Map的几种方法

    public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...

  6. Linux批量重命名文件

    五种方法实现Linux批量重命名文件 Linux批量重命名文件是指对某些特定的文件统一进行重新命名,以改变原来一批文件的名称,这里介绍五种方法来实现. Linux批量重命名文件会涉及到改变一个字母.改 ...

  7. Codeforces 791A Bear and Big Brother&lpar;暴力枚举&comma;模拟&rpar;

    A. Bear and Big Brother time limit per test:1 second memory limit per test:256 megabytes input:stand ...

  8. SOme USeful NOtes for MYself&period;

    SOme USeful NOtes for MYself. B站神奇的频道(YouTube里同名):关于微积分/线代/梯度下降/DL等数学知识的理解,对理解DL很有帮助 https://space.b ...

  9. NGINX Load Balancing – TCP and UDP Load Balancer

    This chapter describes how to use NGINX Plus and open source NGINX to proxy and load balance TCP and ...

  10. 第9月第26天 pairs和ipairs cocos2dx 动画

    1. a={ ip = "127.0.0.1", port = 6789 } for i,v in pairs(a) do print(i,v) end a={1} for i,v ...