首页 > 其他分享 >设计模式-组合模式

设计模式-组合模式

时间:2023-09-29 23:32:14浏览次数:35  
标签:Leaf name 组合 对象 模式 组件 operation 设计模式

(目录)

设计模式-组合模式

什么是组合模式设计模式?

组合模式是一种结构型设计模式,它允许将对象组合成树状结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

在组合模式中,有两种主要类型的对象:叶子对象和组合对象。叶子对象是没有子对象的基本对象,而组合对象是包含子对象的复合对象。组合对象可以是叶子对象或其他组合对象的集合。

组合模式的主要思想是通过将对象组合成树状结构来表示对象之间的整体-部分关系,使得用户可以统一地处理单个对象和组合对象。这种设计模式可以使得客户端代码更加简洁,不需要对单个对象和组合对象进行特殊处理。

组合模式的优点包括:

  1. 简化客户端代码:客户端可以一致地处理单个对象和组合对象,不需要对它们进行特殊处理。
  2. 增加新的组件:可以很容易地增加新的叶子对象或组合对象,而不需要修改现有的代码。
  3. 灵活性:可以灵活地组合对象,构建出不同层次的复杂结构。

组合模式的缺点包括:

  1. 可能会导致设计过于一般化:组合模式可能会导致设计过于一般化,使得系统变得复杂。
  2. 可能会降低系统性能:由于组合对象的嵌套层次可能很深,可能会导致系统性能下降。

组合模式在实际应用中常用于处理树状结构的数据,例如文件系统、图形界面中的控件等。

java示例

下面是一个使用Java实现组合模式的简单案例:

import java.util.ArrayList;
import java.util.List;

// 抽象组件类
abstract class Component {
    protected String name;

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

    public abstract void operation();
}

// 叶子组件类
class Leaf extends Component {
    public Leaf(String name) {
        super(name);
    }

    @Override
    public void operation() {
        System.out.println("Leaf " + name + " operation");
    }
}

// 复合组件类
class Composite extends Component {
    private List<Component> components = new ArrayList<>();

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

    public void add(Component component) {
        components.add(component);
    }

    public void remove(Component component) {
        components.remove(component);
    }

    @Override
    public void operation() {
        System.out.println("Composite " + name + " operation");
        for (Component component : components) {
            component.operation();
        }
    }
}

public class CompositePatternExample {
    public static void main(String[] args) {
        // 创建树状结构
        Composite root = new Composite("Root");
        root.add(new Leaf("Leaf 1"));
        root.add(new Leaf("Leaf 2"));

        Composite branch = new Composite("Branch 1");
        branch.add(new Leaf("Leaf 3"));
        branch.add(new Leaf("Leaf 4"));

        root.add(branch);

        // 调用操作方法
        root.operation();
    }
}

在上述例子中,我们定义了一个抽象组件类 Component,其中包括一个 name 属性和一个抽象方法 operation()。叶子组件类 Leaf 继承自抽象组件类,实现了 operation() 方法。复合组件类 Composite 继承自抽象组件类,内部维护了一个 components 列表,可以添加和移除子组件。复合组件类还重写了 operation() 方法,用于调用子组件的 operation() 方法。

CompositePatternExample 类的 main() 方法中,我们创建了一个树状结构,包括根节点和两个叶子节点。其中一个叶子节点下面还有一个分支节点和两个叶子节点。最后,我们调用根节点的 operation() 方法,会递归地调用所有子组件的 operation() 方法。

运行上述代码,输出结果如下:

Composite Root operation
Leaf Leaf 1 operation
Leaf Leaf 2 operation
Composite Branch 1 operation
Leaf Leaf 3 operation
Leaf Leaf 4 operation

可以看到,通过组合模式,我们可以统一地处理单个对象和组合对象,实现了树状结构的操作。

标签:Leaf,name,组合,对象,模式,组件,operation,设计模式
From: https://blog.51cto.com/onejson/7654398

相关文章

  • 系统进入救援模式进行修复
    现象: 解决方案:(1)#journalctl查看原因   (2)可以看出是内存溢出导致进出救援模式,重启解决#/sbin/reboot-f (3)如果出现mountfailed的现象,就需要进行 umount-l/dev/sdX或者  umount-f/dev/sdX(4)检查文件系统xfs_repair-n/dev/sdX(5)修复文......
  • 设计模式
    模式是指从某个具体的形式中得到的一种抽象,在特殊的非任意性的环境中,该形式不断地重复出现。软件架构的模式描述了一个出现在特定设计语境中的特殊的再现设计问题,并为它的解决方案提供了一个经过充分验证的通用图示。解决方案图示通过描述其组成构件及其责任和相互关系以及它们的协......
  • 命令模式
    命令模式案例引入要求1.买了一套智能家电,有照明灯,风扇,冰箱,洗衣机,我们只要在手机上安装app就可以控制这些家电工作。2.这些智能家电来自不同的厂家,不想针对每一种家电都安装一个app,分别控制,希望使用一个app就可以控制全部的智能家电。3.要实现,一个app控制所有智能家电的需求,......
  • 编程基础与Python的开发模式
    1.3.1程序设计的概念1.逻辑设计(1)过程的起点是分析并确定需求。(2)从现实中抽象。(3)抽象过后是设计算法。2.程序设计(1)选择编程语言。(2)设计数据结构。(3)设计业务逻辑。(4)选择开发模式。1.3.2程序的生命周期(1)硬件部分。(2)操作系统。(3)汇编语言。(4)高级语言。(5)应......
  • 应该也算策略模式吧
    调用方自主选择策略方式:如食堂打饭,有很多窗口供选择,用户只需要去想买的窗口刷卡打饭即可三个关键角色:上下文信息类(Context):用于存放和执行需要使用的具体策略类以及客户端调用的逻辑。抽象策略类(Strategy):定义策略的共有方法。具体策略类(StrategyA等):实现抽象策略类定义的共有......
  • 软件设计模式系列之十八——迭代器模式
    1模式的定义迭代器模式是一种行为型设计模式,它允许客户端逐个访问一个聚合对象中的元素,而不暴露该对象的内部表示。迭代器模式提供了一种统一的方式来遍历不同类型的集合,使客户端代码更加简洁和可复用。2举例说明为了更好地理解迭代器模式,让我们考虑一个简单的例子:一个图书馆......
  • 用策略模式干掉代码里大量的if-eles或则Swatch,提升B格由面向过程转为面向对象
    现象大量的分支选择型代码段看着让人头疼for(Fieldfield:declaredFields){Class<?>type=field.getType();Stringkey=field.getName();Elementresult=resultMap.addElement("result");result.addAttribute......
  • 智慧教育:数字化时代的未来教育模式
    项目背景随着技术的进步和互联网的普及,教育机构和学校开始寻求利用先进的技术和创新的教育方法来提高学习效果和管理效率,包括在线教育、远程学习、教育数据分析等方面的发展。智慧教育旨在将这些技术和方法应用于教育领域,以满足学生、教师和教育机构的不断增长的需求,提供更灵活、......
  • Python sanic AsyncIOScheduler 的单例模式
    sanic是个异步框架。可以配置多个worker,执行定时任务时,也会执行多遍。期望通过单例模式,确保只运行一次。解决思路。AsyncIOScheduler函数有没有自带的单例模式,答案无。网上有没有相关做法,搜集半天,没有太好的办法。试过全局变量,协程共享变量等,均无效。试着用进程的共享变量来解......
  • 【WCH蓝牙系列芯片】-基于CH582开发板—BLE从机开启HAL Sleep模式
    ---------------------------------------------------------------------------------------------------------------------在WCH沁恒官方提供的CH583的EVT资源包中,找到BLE文件中找到【Peripheral:外设从机角色例程】这个工程文件,在这个工程文件中,添加HALSleep模式,开启低功耗模......