【结构型模式】组合模式

一、组合模式概述

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

  • 组合模式分析
    • 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.hqwc.cn/news/630640.html

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

相关文章

VulnHub靶机 DC-5 打靶 渗透测试详情过程

VulnHub靶机 DC-5 打靶 详细渗透测试过程 目录 VulnHub靶机 DC-5 打靶 详细渗透测试过程一、将靶机导入到虚拟机当中二、渗透流程主机发现端口扫描目录爆破文件包含getshell反弹shell提权 一、将靶机导入到虚拟机当中 靶机地址: https://download.vulnhub.com/dc/…

【QT+OpenCV】车牌号检测 学习记录 遇到的问题

【QTOpenCV】车牌号检测 学习记录 首先在QT里面配置好OpenCV .pro文件中加入: INCLUDEPATH G:/opencv/build/include LIBS -L"G:/opencv/build/x64/vc14/lib"\-lopencv_core \-lopencv_imgproc \-lopencv_highgui \-lopencv_ml \-lopencv_video \-lo.c…

ElasticSearch虚拟机安装(单机版)

1.下载7.10.2 下载链接,选择LINUX X86_64下载 2.创建用户 useradd es也可以使用系统默认用户(非root),root用户会报错 3.解压 tar xvf elasticsearch-7.10.2-linux-x86_64.tar.gz假定目录在/home/es/elasticsearch-7.10.2-linux-x86_64 …

安装Milvus的可视化工具Attu教程

提供两种方式来安装可视化工具Attu 一、docker安装 # 执行命令,加个 -d 在后台运行 docker run -d -p 8000:3000 -e MILVUS_URL127.0.0.1:19530 zilliz/attu:v2.2.8 至此安装完成! 浏览器输入地址 http:127.0.0.1:8000即可访问 Attu主页 如果拉取最新…

数仓建模—数仓架构发展史

数仓建模—数仓架构发展史 时代的变迁,生死的轮回,历史长河滔滔,没有什么是永恒的,只有变化才是不变的,技术亦是如此,当你选择互联网的那一刻,你就相当于乘坐了一个滚滚向前的时代列车&#xf…

Redis从入门到精通(二十一)Redis最佳实践(二)mset、pipeline、慢查询优化、内存划分

文章目录 前言7.2 批处理优化7.2.1 命令执行流程7.2.2 mset7.2.3 Pipeline7.2.4 集群下的批处理7.2.4.1 问题与解决方案7.2.4.2 基于Spring的串行化执行 7.3 服务器端优化7.3.1 持久化配置7.3.2 慢查询优化7.3.2.1 什么是慢查询7.3.2.2 如何查看慢查询 7.3.3 命令及安全配置7.3…

android studio gradle 下载不下来的问题

有时候由于网络问题,会发现 android-studio 或 idea 下载不懂 gradle,可以修改 gradle-wrapper.properties 配置文件中的 distributionUrl 选项来解决这个问题。 distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-5.1.1-all.zip 这个选…

【opencv】dnn示例-vit_tracker.cpp 使用OpenCV库和ViTTrack模型实现的视频追踪程序

这段代码是一个使用OpenCV库和ViTTrack模型实现的视频追踪程序。程序通过摄像头或视频文件获取图像序列,并对选定的目标对象进行实时追踪。 代码主要分为以下几个部分: 导入必要的库:程序开始时先导入了iostream,cmath以及相关Ope…

TCP-IP详解卷一:协议 第2章 链路层——阅读总结——

该内容适合程序员查看 第2章 链路层 2.1 引言 链路层有三个目的: 1.为IP模块发送和接收IP数据报; 2.为ARP模块发送ARP请求和接收ARP应答; 3.为RARP发送RARP请求和接收RARP应答; 2.2 以太网和IEEE 802封装 以太网:带…

视频教程下载:用ChatGPT快速提升股票投资能力

学完此视频后可以获得: 学习如何使用人工智能/Chatgpt进行基础/快速/高级财务与研究分析 学习如何使用人工智能/Chatgpt对任何公司进行定性投资研究 学习如何使用人工智能/Chatgpt对任何公司进行定量投资研究 学习如何使用人工智能/Chatgpt创建、预测和分析财务…

OpenHarmony UI动画-recyclerview_animators

简介 带有添加删除动画效果以及整体动画效果的list组件库 下载安装 ohpm install ohos/recyclerview-animatorsOpenHarmony ohpm 环境配置等更多内容,请参考如何安装OpenHarmony ohpm 包 使用说明 引入组件库 import { RecyclerView } from "ohos/recycler…

SOLIDWORKS Composer如何使用3D工具实现更真实的动画效果

当我们使用SOLIDWORKS composer创建动画时,往往会涉及到产品的安装与拆解,现实生活中我们在拆卸组装产品的时候,我们往往需要一些工具的协助,比如扳手、螺丝刀等等,那么我们如何在虚拟动画中也将这一过程以逼真的形式展…