设计模式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可以直接运行。

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

相关推荐
哪 吒1 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10222 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
转世成为计算机大神5 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
小乖兽技术6 小时前
23种设计模式速记法
设计模式
小白不太白9507 小时前
设计模式之 外观模式
microsoft·设计模式·外观模式
小白不太白9507 小时前
设计模式之 原型模式
设计模式·原型模式
澄澈i7 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
小白不太白95014 小时前
设计模式之建造者模式
java·设计模式·建造者模式
菜菜-plus16 小时前
java 设计模式 模板方法模式
java·设计模式·模板方法模式
萨达大16 小时前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式