组合模式的学习

HFSS实战项目——基片集成波导(SIW)带通滤波器 设计了一款直接耦合的SIW带通滤波器, 采用直接耦合的形式, 工作频率覆盖19~21 GHz, 通带内插入损耗小于1.5 dB, 回波损耗小于-20 dB, 带外抑制特性良好. 阅读详情

学校院系展示

 在一个页面展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。

 

传统方案

​ 在这里插入图片描述

 根据组织大小分层次。

 但该方案不好实现对学校、系的添加、删除、遍历等。

 解决方案:把学校、院、系都看作组织结构,他们不是继承关系,而是树形结构,可以更好地实现管理操作。=》组合模式

 

组合模式

 创建了对象组的树形结构,将对象组合成树状结构以表示 整体-部分的层次关系。

 该模式使得用户对单个对象和组合对象的访问具有一致性。使客户能让一致的方式处理个别对象以及组合对象。
 

组合模式结构

在这里插入图片描述 1.组件 (Component) 接口描述了树中简单项目和复杂项目所共有的操作。

 2.叶节点 (Leaf) 是树的基本结构, 它不包含子项目。

 一般情况下, 叶节点最终会完成大部分的实际工作, 因为它们无法将工作指派给其他部分。

 3.容器 (Container)——又名 “组合 (Composite)”——是包含叶节点或其他容器等子项目的单位。 容器不知道其子项目所属的具体类, 它只通过通用的组件接口与其子项目交互。

 容器接收到请求后会将工作分配给自己的子项目, 处理中间结果, 然后将最终结果返回给客户端。

 4.客户端 (Client) 通过组件接口与所有项目交互。 因此, 客户端能以相同方式与树状结构中的简单或复杂项目交互。
 

组合模式适合应用场景

  1.如果你需要实现树状对象结构, 可以使用组合模式。

  2.如果你希望客户端代码以相同方式处理简单和复杂元素, 可以使用该模式。
 

实现方式

 1.确保应用的核心模型能够以树状结构表示。 尝试将其分解为简单元素和容器。 记住, 容器必须能够同时包含简单元素和其他容器。

 2.声明组件接口及其一系列方法, 这些方法对简单和复杂元素都有意义。

 3.创建一个叶节点类表示简单元素。 程序中可以有多个不同的叶节点类。

 4.创建一个容器类表示复杂元素。 在该类中, 创建一个数组成员变量来存储对于其子元素的引用。 该数组必须能够同时保存叶节点和容器, 因此请确保将其声明为组合接口类型。

 实现组件接口方法时, 记住容器应该将大部分工作交给其子元素来完成。

 5.在容器中定义添加和删除子元素的方法。

 记住, 这些操作可在组件接口中声明。 这将会违反_接口隔离原则_, 因为叶节点类中的这些方法为空。 但是, 这可以让客户端无差别地访问所有元素, 即使是组成树状结构的元素。
 

组合模式优缺点

 优点:
   ​✔️​你可以利用多态和递归机制更方便地使用复杂树结构。
   ​✔️​开闭原则。 无需更改现有代码, 你就可以在应用中添加新元素, 使其成为对象树的一部分。

  缺点:
   ❌对于功能差异较大的类, 提供公共接口或许会有困难。 在特定情况下, 你需要过度一般化组件接口, 使其变得令人难以理解。

 

更改后的项目

在这里插入图片描述

代码:

public abstract class OrganizationCompoent {
    private String name; //名字
    private String des; //说明

    public OrganizationCompoent(String name, String des) {
        super();
        this.name = name;
        this.des = des;
    }

    protected void add(OrganizationCompoent organizationCompoent){
        //默认实现
        throw new UnsupportedOperationException();
    }

    protected void remove(OrganizationCompoent organizationCompoent){
        //默认实现
        throw new UnsupportedOperationException();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }
    
    //输出由子类实现
    protected abstract void print();
}
//最小单位 系
public class Department extends OrganizationCompoent {


    public Department(String name, String des) {
        super(name, des);
    }

    //由于是叶子节点(最小单位),因此不用重写add、remove方法


    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

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

//学院
public class College extends OrganizationCompoent {
    //存放系
    List<OrganizationCompoent> list = new ArrayList<>();

    public College(String name,String des){
        super(name,des);
    }

    @Override
    protected void add(OrganizationCompoent organizationCompoent) {
        list.add(organizationCompoent);
    }

    @Override
    protected void remove(OrganizationCompoent organizationCompoent) {
        list.remove(organizationCompoent);
    }

    @Override
    protected void print() {
        System.out.println("----"+getName()+"----");

        for (OrganizationCompoent organizationCompoent : list) {
            organizationCompoent.print();
        }
    }
}

//学校,可以管理下面的院系
public class University extends OrganizationCompoent{

    //拥有的学院
    List<OrganizationCompoent> list = new ArrayList<>();

    public University(String name,String des){
        super(name,des);
    }

    @Override
    protected void add(OrganizationCompoent organizationCompoent) {
        list.add(organizationCompoent);
    }

    @Override
    protected void remove(OrganizationCompoent organizationCompoent) {
        list.remove(organizationCompoent);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    @Override
    protected void print() {
        System.out.println("---"+getName()+"-----");

        //遍历list 学院
        for (OrganizationCompoent organizationCompoent : list) {
            organizationCompoent.print();
        }
    }
}
public class Client {
    public static void main(String[] args) {
        //从大向小创建

        OrganizationCompoent university = new University("大学","不错的高校");

        OrganizationCompoent computerCollege = new College("计算机学院","修电脑的");
        OrganizationCompoent buildedCollege = new College("建筑学院","搬砖的");

        computerCollege.add(new Department("软件工程","敲代码"));
        computerCollege.add(new Department("网络工程","修网线"));

        buildedCollege.add(new Department("土木工程","搬砖"));

        university.add(computerCollege);
        university.add(buildedCollege);

        university.print();
    }
}

注意:

​ 简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者叶子结点的问题。

​ 具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何变动

​ 方便创建复杂的层次结构。

​ 当需要遍历组织机构,或者处理的对象具有树形结构时,便可采用组合模式。

​ 具有较高的抽象性,即当节点间的差异较大时,不合适采用组合模式。

现代软件开发技术 | 第1章:Spring基础 Spring是一个轻量级Java 开发框架,最早由Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。 阅读详情

相关推荐

基于TL431与MOSFET的高效过压保护电路设计详解

本文详细解析了基于TL431与MOSFET的高效过压保护电路设计。通过TL431精准监测电压,驱动MOSFET作为主开关,实现快速可靠的电源保护。文章涵盖电路原理、参数计算、性能优化及实战调试要点,为电子设备提供了一套经典且成本低廉的过压保护解决方案。

weixin_29215391的博客 775

最优化问题基本模型、算法基本思想优势不足

(1,线性规划问题的模型 优点:有统一算法,任何线性规划问题都能求解,解决多变量最优决策的方法。 缺点:对于数据的准确性要求高,只能对线性的问题进行规划约束,而且计算量大,有由线性规划演变的非线性规划法等等后续的方法弥补,但是计算量增加许多。 (2,动态规划的模型 优点:能够得到全局最优解,可以得到一族最优解,由于动态规划方法反映了动态过程演变的联系和特征,在计算时可以利用实际知识和经验提高求解效率。 缺点:没有统一的标准模型,数值方法求解时存在维数灾。(需要额外的内存空间,并且一维问题可能需要

qq_53962537的博客 3826

一人公司 CEO × Accio Work:最大能效实战指南

作为一人公司 CEO,你需要同时扮演市场、销售、运营、财务、产品等多个角色。Accio Work 本质上就是你的。

华盛AI的博客 2100

多目标优化的优缺点

传统的多目标优化方法往往将其转化为各目标之加权和,然后采用单目标的优化技术。但是,这样做存在几大缺点: ①不同性质的目标之间单位不一致,不易作比较; ②各目标加权值的分配带有较大的主观性; ③优化目标仅为各目标的加权和,优化过程中各目标的优度进展不可操作; ④各目标之间通过决策变量相互制约,往往存在相互矛盾的目标,致使加权目标函数的拓扑结构十分复杂。

jinpeng_cumt的博客 1万+

SAP中常见的Debug方式

原文链接:https://mp.weixin.qq.com/s/wT4kThFKYV0PQYhCqpXRWg 大家可以关注我个人公众号,所有分享内容,会在公众号第一时间推送,且阅读排版更好。 愿大家的学习,轻松且愉快。 如果大家觉得有用,希望转发关注,谢谢 导读 SAP系统在企业的应用时,都不会只使用标准功能。 通常情况下,基于特殊的行业需求,以及某些业务部门的管理需求等,都会额外开发出一些增强,报表,对话功能,接口等,从而保证系统的正常运转。 标准知识的逻辑,我们...

Kerwin-G的博客 1万+

Dify-前端本地运行-单点登录

本文介绍了如何在已部署Dify的系统中实现AI应用跳转及页面定制化改造。通过iframe跳转无法满足甲方需求后,作者对Dify前端源码进行了本地化二次开发,主要步骤包括:1) 按照官方文档搭建本地开发环境;2) 修改.env配置文件连接部署好的后端服务;3) 隐藏侧边栏和头部导航栏;4) 实现单点登录功能,通过URL参数获取用户邮箱自动登录。过程中解决了请求拦截导致的登录校验问题,最终达成仅保留对话框界面并同步用户信息的需求。该方案涉及Next.js框架和React技术的应用,为类似定制化需求提供了参

weixin_43163457的博客 3224

   优化模型

优化模型 1.1数学规划模型 线性规划、整数线性规划、非线性规划、多目标规划、动态规划。 1.2微分方程组模型 阻滞增长模型、SARS传播模型。 1.3图论与网络优化问题 最短路径问题、网络最大流问题、最小费用最大流问题、最小生成树问题(MST)、旅行商问题(TSP)、图的着色问题。 1.4概率模型 决策模型、随机存储模型、随机人口模型、报童问题、Markov链模型。 1.5组合优化经典问题 l 多维背包问题(MKP) 背包问题:个物品,对...

weixin_43499818的博客 1万+

BLDC六步换相驱动实战:从霍尔真值表到PWM调速的代码实现

本文详细解析了BLDC六步换相驱动原理,从霍尔真值表解读到PWM调速的代码实现,提供了基于STM32的实战方案。重点介绍了霍尔信号解码、换相状态机设计以及PWM动态调速策略,帮助开发者快速掌握无刷电机驱动技术。

weixin_28273593的博客 211

(一)优化模型——遗传算法

遗传算法具有很强的鲁棒性、随机性、自适应性。算法过程中的遗传、交叉及变异等操作都是通过轮盘赌的随机概率去实现的,增加了整个算法的灵活性,从而使得在进化的过程中产生更加优质的个体,提高整个种群的。

weixin_70267340的博客 1190

Polyworks脚本开发学习笔记(一)-脚本开发环境

详细的总结和记录了利用Polyworks进行脚本开发的一些方法和心得

qq_43662503的博客 6801

二十八.国民技术MCU开发之UID获取与应用

在国民NT MCU中均有一个96位和128位的唯一设备标识符,其中UCID128 位, UID 为 96 位。手册中描述的作用是:通常用来做为序列号或作为密码,在编写闪存时,将此唯一标识与软件加解密算法相结合,进一步提高代码在闪存存储器内的安全性,也可用于激活带安全功能的自举程序(SecureBootloader)。UCID 和 UID,遵守国民技术芯片序列号定义,它包含芯片生产及版本相关信息。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 1677

各种优化算法及其优缺点?

1)梯度下降:每次使用全部数据集进行训练 优点:得到的是最优解 缺点:运行速度慢,内存可能不够 2)随机梯度下降SGM 在随机梯度下降法中每次仅根据一个样本对模型中的参数进行调整 优点:可以一定程度上解决局部最优解的问题 缺点:容易震荡,收敛速度较慢 3)批量梯度下降BGM 优点:容易陷入局部最优解 缺点:收敛速度较快 4)mini_batch梯度下降 假设训练集中的样本的个...

Rnan_prince的博客 9602

华为OD机试真题2025双机位A卷 Java&Go 实现【采购订单】

在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。

MISAYAONE的博客 1259

尚硅谷设计模式学习(10)---[组合模式(Composite Pattern)]

尚硅谷传送门==>B站尚硅谷Java设计模式 ❤❤❤感谢尚硅谷❤❤❤ 最近开始计划学习一下设计模式了,加油!!! 目录情景引入组合模式组合模式在HashMap中的应用 情景引入 编写程序展示一个学校院系结构: 要在一个页面中展示出学校的院系组成, 一个学校有多个学院,一个学院有多个系。 传统思路分析 不能很好实现的管理的操作 组合模式 把学校、院、系都看做是组织结构,他们之间没有继承的关系,而是一个树形结构,可以更好的实现管理操作。 关于组合模式::又称为部分与整体模式,将对

从零开始的异世界JAVA学习 352

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

认真学习设计模式之组合模式(Composite Pattern)

【1】概述 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。 这种类型的设计模式属于结构型模式。 组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象。 ① 三大组件 Component :这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理Component 子部件,

小小默:进无止境 735

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

设计模式之组合模式

今天来聊一聊组合模式:组合模式Composite Pattern 组合模式是树状结构专用模式 组合模式又叫部分整体模式,是用于把一组相似的对象当做一个单一的对象来使用,组合模式依据属性结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式。 我个人理解,组合模式其实就是把树状结构抽象成了一个模式。 《愚公移山》里有一句话:虽我之死,有子存焉;子又生孙,孙又生子;子又有子,子又有孙;子子孙孙无穷匮也。 这句话很应景,其实族谱就是一个很好的树结构例子。 我们来画一下组合模式的类图: 一、我

qq_36291682的博客 614

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

CompositePattern--HeadFirst学习

1、组合模式定义 组合模式允许将对象组合成树状结构来表现整体-部分层次结构。组合能让客户以一致的方式处理个别对象和对象组合。 2、要点 组合包含组件,而组件有两种,一种是叶节点元素与组合。组合持有一群孩子,这些孩子可以是别的组合或叶节点元素。当使用这种方式组织数据的时候,最终会得到树形结构, 根部是一个组合,而组合的分支逐渐往下延伸,直至叶节点。 使用组合,我们能把相同的操作用在组合和个

siyonggang226的专栏 315

设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)

目前已经更新的部分资料:网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!菜单/**煎饼屋菜单实现*//**

2401_84562251的博客 1058

组合模式学习总结

目录   组合模式 引言 定义 组合模式结构图 组合模式实例-产品生产准备 实例描述 实例类图 代码实现 组合模式的扩展 透明组合模式 安全组合模式 抽象叶子类和抽象容器类 总结 模式优点 模式缺点 组合模式 引言 在面向对象系统中,我们常常会遇到一类具有“容器”特征的对象,它们在充当普通对象的同时,又可以作为其他对象的容器,这些对象称为容器对象,而那些只能充...

江川的博客 1424

设计模式学习(1)——组合模式

组合模式学习

xuanli4845的博客 149

设计模式学习笔记十七:组合模式(Composite Pattern)

设计模式学习笔记十七:组合模式(Composite Pattern)      1.概述      组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。      组合模式(Composite Pattern):将对象组合成树形结构以表示‘部分-整

AlbenXie的博客 686

学习笔记【23种设计模式-第九节:Composite Pattern组合模式】

Composite Pattern组合模式 简述: 组合模式,又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示"整体-部分"的层次关系。 组合模式一句树形结构来组合对象,用来表示部分以及整体层次。 这种类型的设计模式属于结构型模式。 组合模式使得用户对单个对象和组合对象的访问具有一致性,即组合能让客户以一致的方式处理个别对象以及组合对象。 例子 编写程序展示一个学校院系结构:要在一个页面中展示出学校的院系组成,一个学校有很多学院,一个学院有很多系。 有一个OrganizationC

qq_53273362的博客 170

学习设计模式《十四》——组合模式

组合模式的本质是【统一叶子对象和组合对象】;

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 910

设计模式学习---12.组合模式(Composite Pattern)

package com.designepattern.compositepattern.v2; import java.util.ArrayList; import java.util.List; /** * @Author:glx * @Date:2020/12/9 * @Content: */ public class MainDemo { public static void main(String[] args) { Branch b...

u010031813的博客 141

Golang学习笔记_34——组合模式

组合模式(Composite Pattern)是一种结构型设计模式,通过将对象组织成树形结构来表示“部分-整体”的层次关系,使客户端可以统一处理单个对象和组合对象。组合模式通过树形结构和统一接口层次结构表示:天然适合文件系统、组织架构等场景递归操作简化:通过统一接口实现递归遍历扩展性提升:新增组件类型不影响现有结构通过接口实现多态特性使用切片管理子组件集合谨慎处理叶子节点的无效方法(如Add()

LuckyLay的博客 1446
上一篇: 装饰者模式
下一篇: 外观模式的学习
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值