组合模式/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();
}
}

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)-------结构型模式

    桥接模式是一种对象结构型模式,其将抽象部分和它的实现部分分离,使它们都可以独立的变化,又称为柄体(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(装饰)-对象结构型模式

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

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

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

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

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

随机推荐

  1. .gitignore过滤个人配置

    git还是一个很好使用的版本工具.所以用eclipse做自己的小玩意儿,在多台电脑之间同步的时候我经常会使用它.. 但是有个问题..不同电脑的eclipse的个人配置稍微有那么一点点的不同..比如有几 ...

  2. [.net core]简介(转)

    原文地址:https://docs.microsoft.com/zh-cn/dotnet/articles/core/ NET Core 是一个通用开发平台,由 Microsoft 和 GitHub  ...

  3. Java面试常见问题汇总

    1 String,StringBuffer与StringBuilder的区别??   String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非 ...

  4. jquery 自定义click事件执行多次

    用jquery绑定一个按钮click事件后,第一次点击后一切正常,第二次点击竟然执行两次,以后越来越多, 后来查看文档发现 jquery click 不是替换原有的function 而是接着添加,所以 ...

  5. PYTHON lambda表达式

    lambda相当于def定义函数     一一对应

  6. BZOJ 2096: [Poi2010]Pilots

    Description 求一个最长的序列,最大值最小值之差不超过 \(k\) . Sol 单调队列. 一个队列直接上就行.. Code /******************************* ...

  7. combobox实现模糊查询自动填充

    利用winform设计软件界面时,经常用到combobox控件,但有时需要绑定数据表中的数据,更进一步,需要实现对数据表中数据的模糊查询功能.本文就讲讲述如何用C#实现combobox下拉列表的模糊查 ...

  8. Mac下配置Apache + Php + Mysql环境

    Apache与PHP的配置 Mavericks同以往的OSX一样自带了apache2.2.24和php5.4.17,但默认情况下没有开启,打开终端 sudo apachectl start 这时在浏览 ...

  9. a标签填充父容器

    body>div>a{Join} div{ width:150px; height:35px; } a{ display:block; line-height:35px; height:3 ...

  10. XML 基础

    linux下xml编辑器 vim gedit editix wonderful;免费30天;可以进行有效性检查 xerces oxygen 收费 xmlcopyedit serna free 是ser ...