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

Day09-设计模式之组合模式

时间:2023-04-16 21:12:22浏览次数:37  
标签:Day09 SchoolComponent 组合 void 节点 schoolComponent 构件 设计模式 public

设计模式之组合模式

引例

在现实生活中,存在很多“部分-整体”的关系,例如,大学中的学院与系、总公司中的分公司与部门,文件系统中的文件与文件夹等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。

组合模式介绍

组合模式定义如下:

组合模式(Composite Pattern)也称为整体部分(Part-Whole)模式 ,它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示 ,使得客户对单个对象和组合对象的使用具有一致性 ,属于结构型模式。

在这里插入图片描述

由上图可以看出,其实根节点和树枝节点本质上属于同一种数据类型,可以作为容器使用;而叶子节点与树枝节点在语义上不属于用一种类型。但是在组合模式中,会把树枝节点和叶子节点看作属于同一种数据类型(用统一接口定义),让它们具备一致行为。

uml类图

img

在组合模式结构图中包含如下几个角色:

  • Component(抽象构件)

    它可以是接口或抽象类,为叶子构件和树枝构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。

  • Composite(树枝构件)

    它在组合结构中表示树枝节点对象,树枝节点包含子节点,其子节点可以是叶子节点,也可以是树枝节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。

  • Leaf(叶子构件)

    它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。

代码实现

假设现在需要编写程序展示一个学校院系结构,展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。并可以对学院,系进行添加,删除等管理操作。

1、抽象构件

package day09_composite.test01;

/**
 * @author coolsheep
 * @date 2023/4/11 9:44
 * @Describe 抽象构建
 */
public interface SchoolComponent {

    //添加子构件
    void add(SchoolComponent schoolComponent);

    //删除子构件
    void remove(SchoolComponent schoolComponent);

    //打印输出信息
    void print();

}

树枝构件

package day09_composite.test01;

import lombok.Data;

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

/**
 * @author coolsheep
 * @date 2023/4/11 9:50
 * @Describe 学校-树枝构件
 */
@Data
public class University implements SchoolComponent{

    private String name;

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

    private List<SchoolComponent> schoolComponents = new ArrayList<>();

    @Override
    public void add(SchoolComponent schoolComponent) {
        schoolComponents.add(schoolComponent);
    }

    @Override
    public void remove(SchoolComponent schoolComponent) {
        schoolComponents.remove(schoolComponent);
    }

    @Override
    public void print() {
        System.out.println("=============="+getName()+"================");
        for (SchoolComponent schoolComponent : schoolComponents) {
            schoolComponent.print();
        }
    }
}

package day09_composite.test01;

import lombok.Data;

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

/**
 * @author coolsheep
 * @date 2023/4/11 9:50
 * @Describe 学院-树枝构件
 */
@Data
public class college implements SchoolComponent{

    private String name;

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

    private List<SchoolComponent> schoolComponents = new ArrayList<>();

    @Override
    public void add(SchoolComponent schoolComponent) {
        schoolComponents.add(schoolComponent);
    }

    @Override
    public void remove(SchoolComponent schoolComponent) {
        schoolComponents.remove(schoolComponent);
    }

    @Override
    public void print() {
        System.out.println("=============="+getName()+"================");
        for (SchoolComponent schoolComponent : schoolComponents) {
            schoolComponent.print();
        }
    }
}

叶子构建

package day09_composite.test01;

import lombok.Data;

/**
 * @author coolsheep
 * @date 2023/4/11 10:20
 * @Describe
 */
@Data
public class department implements SchoolComponent{

    private String name;

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

    @Override
    public void add(SchoolComponent schoolComponent) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void remove(SchoolComponent schoolComponent) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void print() {
        System.out.println(getName());
    }
}

组合模式的应用场景

  1. 在需要表示一个对象整体与部分的层次结构的场合。

  2. 要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。

    比如树形菜单,操作系统目录结构,公司组织架构等。

    image-20230410215216526

标签:Day09,SchoolComponent,组合,void,节点,schoolComponent,构件,设计模式,public
From: https://www.cnblogs.com/coolsheep/p/17324076.html

相关文章

  • 关于敏捷开发、系统重构、设计原则、设计模式之间的思考
    敏捷开发、系统重构、设计模式是软件开发中不同的概念,它们之间有一些联系和相互影响。敏捷开发方法强调快速响应客户需求,通过迭代和增量的方式来开发软件。在敏捷开发中,设计模式可以被用来提高软件质量和可维护性,因为设计模式是已经被证明有效的软件设计方案。在开发过程中,团队可......
  • 《花雕学AI》20:ChatGPT使用之体验评测AI EDU的网页版+桌面端+Android+App store组合
    最近准备出门,要去新疆哈密参加活动,一直在寻找手机上可用的AI移动端。昨天在网上偶然找到了AIEDU(这个不是MSRA创立的人工智能开源社区),其链接是:https://ai.aigcfun.com,今天就尝试做个相关体验与学习的记录。打开首页如下:  引言:人工智能聊天机器人ChatGPT是一种基于GPT-......
  • 30-组合可编程逻辑器件-PLD
    组合可编程逻辑器件1.PLD的结构1.1结构1.2表示方法实心点表示连接,但是不可编程×点表示连接,但是可以编程2.编程技术2.1熔丝工艺每个输入线连接二极管和保险丝2.2电擦除3.PLD分类低密度PLD和高密度PLD低密度PLD又分为:PROM/PLA/PAL/GAL高密度PLD又分为:......
  • 28-组合逻辑集成电路-数据比较器
    比较器1.回顾数据选择器,四选一使用卡诺图进行四选一,选择AB为控制端或CD为控制端结果不一样有时候垂直方向画卡诺图,结果会更简单2.一位二进制数的比较器可以快速列出真值表使用门电路实现一位比较器3.二位二进制数比较先比较高位,高位相同,低位大小才会影响结果。高......
  • day09 react完整手写
     实现Hooks的数据结构fiberNode中可用的字段:memoizedStateupdateQueue  实现useState包括2方面工作:实现mount时useState的实现实现dispatch方法,并接入现有更新流程内 ......
  • Vue3组合API自动引入插件
    插件名:unplugin-auto-importurl:https://github.com/antfu/unplugin-auto-import安装1、下载插件npmiunplugin-auto-import-D2、配置vite.config.tsimportvuefrom'@vitejs/plugin-vue'import{defineConfig}from'vite'//引入插件,因为我使用的vite+ts,所以这里引......
  • 27-组合逻辑集成电路-数据选择器
    数据选择器1.数据选择器数据选择器:多路信号进来,出去的路只有一条,通过一个开关控制,多路选一路(多选1)数据分配器:一路信号进入,在多路输出中选择一路进行输出二选一,通过一个开关进行控制,书写选择器表达式的时候,表达式的每一项用开关变量组合*信号四选一,用两个控制变量进行控制......
  • 26-组合集成电路-译码器
    译码器1.译码器的概念与分类1.1译码器的概念译码器(decoder):将输入的代码“翻译”成另外一种代码输出。编码器(encoder):将一组编码输入的每一个信号编成一个与之对应的输出代码。译码器将一组二进制数还原为一个数字一个符号,一个信息。比如输入1000,将其翻译为8译码器—输......
  • 25-组合逻辑集成电路-编码器
    编码器组合逻辑集成电路(MSI)组合电路使用小规模电路设计,描述清楚,用小规模的集成电路实现;小规模集成电路比较灵活常用的部件(译码器\编码器\比较器\选择器)都是事先做好,直接进行使用1.编码器概念及分类1.1编码器的概念编码器:使用一组二进制数表示一个数值或者是符号。例......
  • 组合计数和逆元
    1.基本公式相当于直接去求\(​\frac{1}{n!}\)也就是说咱们要是去求\(\frac{1}{n}\)逆元2.怎么求逆元?代码模板LLexgcd(LLa,LLb,LL&x,LL&y)//扩展欧几里得算法{ if(b==0) { x=1,y=0; returna; } LLret=exgcd(b,a%b,y,x); y-=a/b*x; returnret;}LLg......