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

设计模式-组合模式

时间:2024-06-15 18:10:35浏览次数:29  
标签:exe name 组合 模式 节点 add File 设计模式 public

组合模式

组合模式,也称为整体部分模式,他的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的使用具有一致性。(树形结构)
组合与聚合的关系:组合生命周期保持一致。聚合具有不同的生命周期。

角色:
  • 抽象根节点(Component):定义系统各层次对象的共有方法和属性,可以预先定义一些默认行为和属性。
  • 树枝节点(Composite):定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构。
  • 叶子节点(Leaf):叶子节点对象,其下再无分支,是系统层次遍历最小的单位
应用场景:
  • 希望客户端可以忽略组合对象与单个对象的差异时;
  • 对象层次具备整体和部分,呈树形结构

组合模式,在代码具体实现上,有两种不同的方式:透明组合模式和安全组合模式
透明组合模式,直白一点地说,就是将所有需要的业务都写在抽象根节点上,并给出默认行为。树枝节点,叶子节点重写所需要方法,不需要的不重写。安全组合模式,抽象接口仅仅定义共同的逻辑,树枝节点和叶子节点各自定义自己特有的逻辑。

安全模式举例如下:

package com.jdwa.combination;

public abstract class Directory {
    protected String name;

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

    public abstract void show();
}

package com.jdwa.combination;

public class File extends Directory{

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

    @Override
    public void show() {
        System.out.println(this.name);
    }
}

package com.jdwa.combination;

import com.jdwa.builder.Director;

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

public class Folder extends Directory{

    private List<Directory> dirs;

    private Integer level;

    public Folder(String name,Integer level){
        super(name);
        this.level = level;
        this.dirs = new ArrayList<>();
    }

    public void show() {
        System.out.println(this.name);
        for (Directory dir:this.dirs){
            if (this.level != null){
                for (int i = 0 ;i < this.level; i++){
                    System.out.print("    ");
                }
                for (int i = 0 ; i < this.level; i++){
                    if (i == 0 ) System.out.print("+");
                    System.out.print("-");
                }
            }
            dir.show();
        }
    }

    public boolean add(Directory dir){
        return this.dirs.add(dir);
    }

    public boolean remove(Directory dir){
        return this.dirs.remove(dir);
    }

    public Directory get(int index){
        return this.dirs.get(index);
    }

    public void list(){
        for (Directory dir : this.dirs){
            System.out.println(dir.name);
        }
    }
}
package com.jdwa.combination;

public class Client {
    public static void main(String[] args) {
        System.out.println("===========安全组合模式===========");
        File qq = new File("QQ.exe");
        File wechat = new File("Wechat.exe");

        Folder office = new Folder("办公软件",2);

        File word = new File("Word.exe");
        File ppt = new File("PPT.exe");
        File excel = new File("Excel.exe");

        office.add(word);
        office.add(ppt);
        office.add(excel);

        Folder wps = new Folder("金山软件",3);
        wps.add(new File("WPS.exe"));
        office.add(wps);

        Folder root = new Folder("根目录",1);
        root.add(qq);
        root.add(wechat);
        root.add(office);

        System.out.println("===========show()===========");
        root.show();

        System.out.println("===========list()===========");
        root.list();

    }
}

运行结果:

===========安全组合模式===========
===========show()===========
根目录
    +-QQ.exe
    +-Wechat.exe
    +-办公软件
        +--Word.exe
        +--PPT.exe
        +--Excel.exe
        +--金山软件
            +---WPS.exe
===========list()===========
QQ.exe
Wechat.exe
办公软件
欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

标签:exe,name,组合,模式,节点,add,File,设计模式,public
From: https://www.cnblogs.com/caozz/p/18249586/combination

相关文章

  • 九星创客模式:创新引领新零售风潮
    九星创客模式确实是一种创新的商业模式,它结合了团队协作、多元化销售方式和激励机制,成功实现了产品的快速销售和客户群体的扩大。以下是关于九星创客模式的详细解析:1.团队结构与层级九星创客系统以团队为基础,每个成员都是团队的一部分,共同为达成销售目标而努力。系统设置了......
  • 稳定性与可持续性:九星创客模式的长期优势
    九星创客模式确实是一种创新的商业模式,它结合了团队协作、多元化销售方式和激励机制,成功实现了产品的快速销售和客户群体的扩大。以下是关于九星创客模式的详细解析:1.团队结构与层级九星创客系统以团队为基础,每个成员都是团队的一部分,共同为达成销售目标而努力。系统设置了......
  • java设计模式之-工厂模式
    工厂模式是一种创建对象的设计模式,它通过将对象的实例化过程封装在一个工厂类中,从而实现对象的创建和使用的解耦。它属于创建型模式的一种,可以帮助我们更加灵活地创建对象。工厂模式主要解决的问题是在对象的创建过程中,如果直接在代码中使用new关键字来创建对象,会导致代码的耦合......
  • 【导航定位】卡尔曼滤波kalman GPS和惯性船舶组合导航(弧长 速度分量 航向 航向变化率
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。......
  • 文献学习——PWM - PFM模式无缝转换的PFC变换器统一控制
    PWM-PFM模式无缝转换的PFC变换器统一控制摘要:断续导通模式通常应用在升压功率因数校正转换器中。这篇文章提出了一种基于虚拟阻抗原理的实现脉冲宽度调制控制和脉冲频率调制控制的统一控制方法。控制模式可以简单的通过只调整一个控制参数来改变。因此,在综合考虑电流纹波、......
  • C++多线程:生产者消费者模式
    文章目录一、模式简介二、头文件、全局变量2.1仓库类的设计2.1.1关于仓库类的分析2.1.2仓库类的设计代码2.2工厂类的设计2.2.1关于工厂类的分析2.2.2工厂类的设计代码a将产品item放到仓库repob将产品item从仓库repo取出c生产者操作d消费者操作2.2.3主函数代......
  • 【Python】排班系统与排列组合
    先看最简单的情况,若有赵钱孙李周5人需要排班,一人一天,情况如下:fromitertoolsimportpermutationsforpinpermutations('赵钱孙李周'):#全排列print(''.join(p))此时会打印出 '赵钱孙李周'5人的所有情况。现在假如第一天的人必须是周,则需要加上判断即可:fromite......
  • Java版SaaS模式云HIS系统源码Java+Spring+SpringBoot+SpringMVC 基层卫生健康云HIS源码
    Java版SaaS模式云HIS系统源码Java+Spring+SpringBoot+SpringMVC基层卫生健康云HIS源码云HIS全称为基于云计算的医疗卫生信息系统(Cloud-BasedHealthcareInformationSystem),是运用云计算、大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供......
  • 【pycharm调试模式异常】can‘t open file ‘C:\\Program‘: [Errno 2] No such fil
    错误系统:wendows10pycharm版本:pycharm专业版和社区版都有对应问题2023.1和2023.2都有同样问题python版本:3.11官网问题地址上面只是我出问题的环境,不知道其他环境或者版本有没有同样的问题现象:执行debug,程序启动后立即退出,错误信息:can’topenfile‘C:\Progra......
  • 无迹卡尔曼滤波UKF INS和GPS组合导航(位置误差 速度误差 松组合方式)【含Matlab源码 467
    ......