设计模式14——组合模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

组合模式(Composite)

是一种行为型模式。

目录

一、概述

1.1、主要的角色有三种:

1.2、直观的理解组合模式:

1.3、技术角度,描述对象之间关系的UML图:

二、举例

2.1、分析如下:

2.2、对象之间的关系用UML图表示如下:

2.3、Java实现代码如下:


一、概述

复制代码
1、将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性;
复制代码
2、基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。

1.1、主要的角色有三种:

  1. 组合(或组件)的抽象类或接口
  2. 分支类
  3. 叶子类

1.2、直观的理解组合模式:

其实可以把组合模式当做建立一个树形结构,然后可以对这个树的所有节点进行统一操作,同样这个树还可以根据需要添加删除其它节点或树,从而组成更大的树或更小的树。

1.3、技术角度,描述对象之间关系的UML图:

二、举例

简单举例,如下图所示,我们要实现这个结构,并且打印每个节点的名字。

2.1、分析如下:

1、分析上述问题:

  • 本例比较简单,可以直接看到上述有7个对象,且是一个树形结构(实践中可能需要我们花一点功夫去判断这些对象是否可以应用这种结构)
  • 要打印每一个节点的名字,也就是我们需要对它们进行重复打印的操作
  • 这时可以考虑使用组合模式,将他们看成一个整体,对这个整体进行统一打印的操作
    2、针对角色和方法设计上:

++组合(或组件)的抽象类或接口++:

  • 创建一个抽象节点

++分支类++:

  • 本例有三个分支,名字需要分别设置

++叶子类++:

  • 本例有四个叶子,名字需要分别设置

自定义方法:

  • 输出本节点名字

2**.2、对象之间的关系用UML图表示如下:**

2.3、Java实现代码如下:

组合(组件)的抽象类:

java 复制代码
abstract class Component {
    protected String name;

    public Component(String name) {
        this.name = name;
    }

    public abstract void add(Component component);

    public abstract void remove(Component component);

    public abstract void display(int depth);
}

分支类:

java 复制代码
public class Composite extends Component {
    List<Component> list = new LinkedList<>();

    public Composite(String name) {
        super(name);
    }

    @Override
    public void add(Component component) {
        list.add(component);
    }

    @Override
    public void remove(Component component) {
        list.remove(component);
    }

    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) { //每个分支节点自己要干的事情,根据实际需要编写
            System.out.print("-");
        }
        System.out.println(this.name);

        for (Component component : list) { //遍历此分支节点的子节点,必须要有
            component.display(depth + 2);
        }

        //...
    }
}

叶子类:

java 复制代码
public class Leaf extends Component {
    public Leaf(String name) {
        super(name);
    }

    @Override
    public void add(Component component) {
        System.out.println("叶子节点没有添加子节点功能!");
        //...
    }

    @Override
    public void remove(Component component) {
        System.out.println("叶子节点没有删除子节点功能!");
        //...
    }

    @Override
    public void display(int depth) {
        for (int i = 0; i < depth; i++) { //每个叶子节点自己要干的事情,根据实际需要编写
            System.out.print("-");
        }
        System.out.println(this.name);

        //...
    }
}

主程序(发起请求的类):

java 复制代码
public class Main {
    public static void main(String[] args) {
        Composite root = new Composite("root");//创建根节点

        Leaf leafroot = new Leaf("leafroot");//创建叶子节点
        Composite compositeA = new Composite("compositeA");//创建分支节点
        root.add(leafroot);
        root.add(compositeA);

        Leaf leafA = new Leaf("leafA");//创建叶子节点
        Composite compositeAA = new Composite("compositeAA");//创建分支节点
        compositeA.add(leafA);
        compositeA.add(compositeAA);

        Leaf leafAAA = new Leaf("leafAAA");//创建叶子节点
        Leaf leafAAB = new Leaf("leafAAB");//创建叶子节点
        compositeAA.add(leafAAA);
        compositeAA.add(leafAAB);

        root.display(1);
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!

相关推荐
蜡笔小新..8 小时前
【设计模式】软件设计原则——开闭原则&里氏替换&单一职责
java·设计模式·开闭原则·单一职责原则
性感博主在线瞎搞9 小时前
【面向对象】设计模式概念和分类
设计模式·面向对象·中级软件设计师·设计方法
lucifer3119 小时前
JavaScript 中的组合模式(十)
javascript·设计模式
lucifer3119 小时前
JavaScript 中的装饰器模式(十一)
javascript·设计模式
蜡笔小新..10 小时前
【设计模式】软件设计原则——依赖倒置&合成复用
设计模式·依赖倒置原则·合成复用原则
刷帅耍帅10 小时前
设计模式-代理模式
设计模式·代理模式
神的孩子都在歌唱17 小时前
行为设计模式 -观察者模式- JAVA
java·观察者模式·设计模式
刷帅耍帅1 天前
设计模式-解释器模式
设计模式·解释器模式
刷帅耍帅1 天前
设计模式-备忘录模式
设计模式·备忘录模式