【结构型模式】组合模式

一、组合模式概述

        组合模式的定义与意图将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。(对象结构型)

  • 组合模式分析
    • 1.当容器对象的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理;
    • 2.由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下客户端希望一致地处理它们,因为对于这些对象的区别对待将会使程序非常复杂。
  • 如何一致地对待容器对象和叶子对象?
    • 组合模式通过一种巧妙地设计方案使得用户可以一致性地处理整个树形结构或者树形结构地一部分,它描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无须对它进行区分,可以一致地对待容器对象和叶子对象。
  • 安全组合模式
    • 1.抽象构件Component中没有声明任何用于管理成员对象的方法,而是在Composite类中声明并实现这些方法;
    • 2.对于叶子对象,客户端不可能调用到这些方法;
    • 3.缺点是不够透明,客户端不能完全针对抽象编程。必须有区别地对待叶子构件和容器构件。
  • 透明组合模式
    • 1.抽象构件Component中声明了所有用于管理成员对象的方法,包括add()、remove()、以及getChild()等方法;
    • 2.在客户端看来,叶子对象与容器对象所提供的方法是一致的,客户端可以一致地对待所有的对象;
    • 3.缺点是不够安全,因为叶子对象和容器对象在本质上是有区别的。
  • 组合模式的优缺点
    • 优点
      • 1.可以清楚的定义分层次的复杂对象,表示对象的全部或部分层次,让客户端忽略了层次的差异,方便对整个层次结构将进行控制;
      • 2.客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码;
      • 3.增加新的容器构件和叶子构件都很方便,符合开闭原则;
      • 4.为树形结构的面向对象实现提供了一种灵活的解决方案。
    • 缺点
      • 在增加新构件时很难对容器中的构件类型进行限制。
  • 适用环境
    • 1.在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待他们;
    • 2.在一个使用面向对象语言开发的系统中需要处理一个树形结构;
    • 3.在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。

二、代码实现

        组合模式的结构:

  • Component(抽象构件)
  • Leaf(叶子构件)
  • Composite(容器构件)

        某教育机构组织结构如下图所示:

        在该教育机构的OA系统中可以给各级办公室下发公文,试采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。

        2.1 Component(抽象构件类:AbstractHead)
package composite.OAteacher;
//(1)Component抽象构件类:AbstractHead
public abstract class AbstractHead {public abstract void receiveDocument();
}
        2.2 Leaf(叶子构件:AdminOffice、ProvostOffice)
package composite.OAteacher;
//(2.1)Leaf叶子构件类:AdminOffice
public class AdminOffice extends AbstractHead {	private String officeName;	public AdminOffice(String officeName){this.officeName = officeName;}	public void receiveDocument(){System.out.println(officeName + "收到文件");}
}
package composite.OAteacher;
//(2.2)Leaf叶子构件类:ProvostOffice
public class ProvostOffice extends AbstractHead {private String officeName;	public ProvostOffice(String officeName){this.officeName = officeName;}	public void receiveDocument(){System.out.println(this.officeName + "收到文件...");}	
}
        2.3 Composite(容器构件:Branch,定义构件行为)
package composite.OAteacher;import java.util.*;
//(3)composite:定义组件行为,比如下发文件动作
public class Branch extends AbstractHead {	private String branchName;ArrayList list = new ArrayList();	public Branch(String branchName){this.branchName = branchName;}	public void addSubOrg(AbstractHead elment){list.add(elment);}	public void removeSubOrg(AbstractHead element){list.remove(element);}	public void receiveDocument(){		System.out.println("-----------------------------------------");for(Object object: list){//System.out.println(object.getClass());if(object.getClass().toString().equals("class Branch")){				((Branch)object).issudedDocument();}else((AbstractHead)object).receiveDocument();			}		}public void issudedDocument(){System.out.println(branchName + "下发文件......");this.receiveDocument();}
}
        2.4 main方法实现组合模式
package composite.OAteacher;
//(5)客户端测试类:Client
/** 题目:
某教育机构组织结构如下图所示:
在该教育机构的OA系统中可以给各级办公室下发公文,现采用组合模式设计该机构的组织结构,绘制相应的类图并编程模拟实现,在客户端代码中模拟下发公文。*/
public class Client {	public static void main(String args[]){	AbstractHead office11 = new ProvostOffice("长沙教学点教务办公室");AbstractHead office12 = new ProvostOffice("长沙教学点行政办公室");Branch b1 = new Branch("长沙教学点");b1.addSubOrg(office11);b1.addSubOrg(office12);AbstractHead office21 = new ProvostOffice("湘潭教学点教务办公室");AbstractHead office22 = new ProvostOffice("湘潭教学点行政办公室");Branch b2 = new Branch("湘潭教学点");b2.addSubOrg(office21);b2.addSubOrg(office22);AbstractHead office31 = new ProvostOffice("湖南分校教务办公室");AbstractHead office32 = new ProvostOffice("湖南分校行政办公室");Branch b3 = new Branch("湖南分校");b3.addSubOrg(office31);b3.addSubOrg(office32);b3.addSubOrg(b1);b3.addSubOrg(b2);AbstractHead office41 = new ProvostOffice("北京总部教务办公室");AbstractHead office42 = new ProvostOffice("北京总部行政办公室");Branch b4 = new Branch("北京总部");b4.addSubOrg(office41);b4.addSubOrg(office42);b4.addSubOrg(b3);b4.issudedDocument();//b4.receiveDocument();		}
}
        2.5 UML图

三、代码结构图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法|基础算法|高精度算法

基础算法|位运算 1.高精度加法 2.高精度减法 3.高精度乘法 4.高精度除法 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 高精度加法 …

【C++学习】map和set

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 四、set 4.1 set的介绍 4.2 set的使用 4.2.1 set的模板参数列表 4.2.2 set的构造 4.2.3 set的容量 4.2.4 set修改操作 4.2.5 set的使用举例 五、map 5.1 map的介绍 5.2 map的使用 5.2.1 map的模板参数说…

7.C++:多态

一、 virtual关键字 //1.可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一; //2.可以在菱形继承中,完成虚继承,解决数据冗余和二义性; 两个地方使用同一关键字,但二者间没有一点关联 二…

淘宝扭蛋机小程序开发:开启购物娱乐新纪元

在数字时代浪潮的推动下,小程序作为新兴的交互平台,正在不断引领着购物方式的革新。淘宝扭蛋机小程序的开发,便是这一变革中的一颗璀璨明星,它将传统扭蛋机的趣味与电商购物的便捷完美融合,为用户带来了前所未有的购物…

Weakly Supervised Audio-Visual Violence Detection 论文阅读

Weakly Supervised Audio-Visual Violence Detection 论文阅读 摘要III. METHODOLOGYA. Multimodal FusionB. Relation Modeling ModuleC. Training and Inference IV. EXPERIMENTSV. CONCLUSION阅读总结 文章信息: 发表于:IEEE TRANSACTIONS ON MULTIME…

【Redis 神秘大陆】006 灾备方案

六、Redis 灾备方案 6.1 存储方案 6.1.1 基础对比 RDB持久化AOF持久化原理周期性fork子进程生成持久化文件每次写入记录命令日志文件类型二进制dump快照文件文本appendonly日志文件触发条件默认超过300s间隔且有1s内超过1kb数据变更永久性每秒fsync一次文件位置配置文件中指…

政安晨:【深度学习神经网络基础】(十)—— 反向传播网络中计算输出节点增量与计算剩余节点增量

目录 简述 二次误差函数 交叉熵误差函数 计算剩余节点增量 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正&#xf…

刷穿力扣006-剑指offer一数组——02寻找目标值-二维数组

刷穿力扣006-剑指offer<一>数组——02寻找目标值-二维数组 基本面试题都是我带大家刷的力扣热题100和剑指offer的75道题&#xff0c;建议刷两遍&#xff01;&#xff08;ps:想找工作实习的同学&#xff0c;文末有面试八股和简历模板&#xff09; 题目&#xff1a; 语言…

计算机网络 TCP/IP体系 物理层

一. TCP/IP体系 物理层 1.1 物理层的基本概念 物理层作为TCP/IP网络模型的最低层&#xff0c;负责直接与传输介质交互&#xff0c;实现比特流的传输。 要完成物理层的主要任务&#xff0c;需要确定以下特性&#xff1a; 机械特性&#xff1a;物理层的机械特性主要涉及网络…

【Altium Designer 20 笔记】PCB层

Top Overlay & Bottom Overlay (顶部丝印层和底部丝印层)&#xff1a; 用于标记元件、连接和其他重要信息。丝印层是 PCB 表面的一层&#xff0c;上面印上文字、图标或标记。 Top Solder & Bottom Solder (顶部阻焊层和底部阻焊层)&#xff1a; 阻焊层、开窗层、绿油层…

Jackson 2.x 系列【25】Spring Boot 集成之起步依赖、自动配置

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 前言2. 起步依赖3. 自动配置3.1 JacksonPrope…

K8S认证工程师(CKA)考试速通经验分享(含答案)

昨天参加了Linux Foundation推出的Certified Kubernetes Administrator(CKA)考试&#xff0c;今天收到邮件通知通过啦&#xff5e;分数是93/100分 证书这个样子 ➡️随着应用现代化成为IT/互联网行业大趋势&#xff0c;企业的系统架构逐渐向微服务、容器化转型&#xff0c;好处…

spring03:bean的自动装配

spring03&#xff1a;bean的自动装配 文章目录 spring03&#xff1a;bean的自动装配前言&#xff1a;一、 在xml中显示的配置&#xff1a;分析&#xff1a; People类&#xff1a;Cat类&#xff1a;Dog类&#xff1a;1. 在xml中显示的配置&#xff1a; 二、 隐式的自动装配bean【…

量子密钥分发系统设计与实现(一):系统基本架构讨论

经过一段时间讨论&#xff0c;我们了解到量子密钥分发设备是当前量子保密通信系统的基础。从本文开始&#xff0c;我将开启量子密钥分发系统设计与实现系列&#xff0c;详细讨论量子密钥分发设备如何从0到1的搭建。 1.QKD系统总体讨论 QKD系统的核心功能就是为通信双方提供理论…

聊聊最近两星期的学习吧!

今天是4月14号。 自从我3月份回到学校之后&#xff0c;我每天都有记录自己的学习时长。今天晚上&#xff0c;我在复盘我自己学习时长的时候&#xff0c;我发现&#xff0c;在整个四月份&#xff0c;我平均每天的有效学习时长只有6h&#xff0c;而且到今天为止&#xff0c;整个四…

Python基于循环神经网络的情感分类系统设计与实现,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

spring02:DI(依赖注入)

spring02&#xff1a;DI&#xff08;依赖注入&#xff09; 文章目录 spring02&#xff1a;DI&#xff08;依赖注入&#xff09;前言&#xff1a;一、构造器注入&#xff08;constructor&#xff09;二、set注入&#xff1a;分析&#xff1a; 1. Student类&#xff1a;2. Addres…

编程入门(二)【计算机基础三】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言五、常用软件的相关介绍六、操作系统的相关介绍七、Window11系统的基本操…

vue3 源码解析(7)— diff 算法源码的实现

前言 vue3 采用的 diff 算法名为快速 diff 算法&#xff0c;整个 diff 的过程分为以下5个阶段完成。 处理前置节点处理后置节点处理仅有新增节点处理仅有删除节点处理其他情况&#xff08;新增 / 卸载 / 移动&#xff09; 这里我们先定义新旧两个节点列表&#xff0c;接下来…

数据结构速成--栈

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 一…