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

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

相关推荐
charlie1145141919 小时前
精读C++20设计模式:行为型设计模式:中介者模式
c++·学习·设计模式·c++20·中介者模式
虫师c12 小时前
分布式系统设计模式:从理论到实践
微服务·设计模式·系统架构·高可用·分布式系统
半旧夜夏12 小时前
【设计模式】核心设计模式实战
java·spring boot·设计模式
ThisIsMirror14 小时前
设计模式简要介绍
设计模式
Lei活在当下19 小时前
【业务场景架构实战】7. 多代智能手表适配:Android APP 表盘编辑页的功能驱动设计
android·设计模式·架构
澄澈i21 小时前
设计模式学习[20]---桥接模式
c++·学习·设计模式·桥接模式
o0向阳而生0o1 天前
106、23种设计模式之备忘录模式(15/23)
设计模式·备忘录模式
小猪佩奇TONY1 天前
C++ 学习(3) ----设计模式
c++·学习·设计模式
zhulangfly2 天前
轻松理解智能体设计模式(1/6):提示链(Prompt Chaining)
设计模式·prompt chaining
da_vinci_x2 天前
2D角色动画进阶:Spine网格变形与序列帧特效的混合工作流
游戏·设计模式·设计师·photoshop·spine·游戏策划·游戏美术