当前位置: 首页 > news >正文

23种设计模式之组合模式

组合模式

1、定义

组合模式:组合多个对象形成树状结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象

2、组合模式结构

  • Component(抽象构件):可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加、删除、获取子构件等
  • Leaf(叶子构件):表示叶子结点对象,没有子节点,它实现了抽象构件中定义的行为。对于访问及管理子构件的方法,可以通过抛出异常、提示错误等方法进行处理
  • Composite(容器构件):表示容器节点对象,包含子节点可以是叶子节点,也可以是容器节点,它提供了一个集合用于存储子节点。实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法

组合模式结构图

3、示例

Component

public abstract class Employer {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public abstract void add(Employer employer);public abstract void delete(Employer employer);public List<Employer> employers;public void printInfo() {System.out.println(name);}public List<Employer> getEmployers() {return this.employers;}
}

Leaf

public class Programmer extends Employer{public Programmer(String name) {setName(name);//程序员, 表示没有下属了employers = null;}@Overridepublic void add(Employer employer) {}@Overridepublic void delete(Employer employer) {}
}
public class ProjectAssistant extends Employer{public ProjectAssistant(String name) {setName(name);//项目助理, 表示没有下属了employers = null;}@Overridepublic void add(Employer employer) {}@Overridepublic void delete(Employer employer) {}
}

Composite

public class ProjectManager extends Employer{public ProjectManager(String name) {setName(name);employers = new ArrayList<>();}@Overridepublic void add(Employer employer) {employers.add(employer);}@Overridepublic void delete(Employer employer) {employers.remove(employer);}
}

Client

public class Client {public static void main(String[] args) {Employer pm = new ProjectManager("项目经理");Employer pa = new ProjectAssistant("项目助理");Employer programmer1 = new Programmer("程序员甲");Employer programmer2 = new Programmer("程序员乙");//为项目经理添加项目助理pm.add(pa);//为项目经理添加程序员pm.add(programmer1);pm.add(programmer2);List<Employer> ems = pm.getEmployers();for (Employer em : ems) {System.out.println(em.getName());}}
}

输出结果

项目助理
程序员甲
程序员乙

4、组合模式优缺点

4.1优点
  • 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,方便对整个层次结构进行控制
  • 客户端可以一致的使用一个组合结构或者其他单个对象,无须对现有类库进行任何修改,符合开闭原则
  • 增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合开闭原则
  • 为树形结构的面向对象实现提供了一种灵活的解决方案
4.2缺点
  • 在增加新构件时很难对容器中的构件类型进行限制

5、组合模式适用环境

  • 表示对象的部分-整体层次结构
  • 忽略组合对象与单个对象的不同,统一

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 什么是电脑监控软件?六款知名又实用的电脑监控软件
  • ONLYOFFICE协作空间与Drupal如何集成
  • 嵌入式学习——Linux高级编程复习(网络编程)——day42
  • 聊聊C/S模式架构的优缺点
  • 掌握Excel字符串拼接
  • RabbitMQ-topic exchange使用方法
  • NLP——电影评论情感分析
  • nginx配置https协议(测试环境)
  • PDF格式分析(八十五)——水印注释(Watermark)
  • 如何开发一个直播APP:功能介绍与开发步骤详解
  • 实时通信websocket和sse
  • 关于自学编程的9点忠告
  • 【BeX5】知识中心
  • Android启动流程
  • 在 Windows 操作系统中,可以通过命令行工具来杀死进程
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • Angular 响应式表单之下拉框
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JavaScript服务器推送技术之 WebSocket
  • JavaScript学习总结——原型
  • jquery ajax学习笔记
  • Linux链接文件
  • Objective-C 中关联引用的概念
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • 从setTimeout-setInterval看JS线程
  • 经典排序算法及其 Java 实现
  • 前端相关框架总和
  • - 转 Ext2.0 form使用实例
  • ​比特币大跌的 2 个原因
  • #mysql 8.0 踩坑日记
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • ()、[]、{}、(())、[[]]命令替换
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (11)MSP430F5529 定时器B
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (七)Activiti-modeler中文支持
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (四)Android布局类型(线性布局LinearLayout)
  • (转载)hibernate缓存
  • .net 7 上传文件踩坑
  • .Net MVC + EF搭建学生管理系统
  • .Net MVC4 上传大文件,并保存表单
  • .net 托管代码与非托管代码
  • .NET/C# 使用反射注册事件
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET关于 跳过SSL中遇到的问题
  • .net通用权限框架B/S (三)--MODEL层(2)
  • @ModelAttribute 注解
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [BZOJ 3282] Tree 【LCT】
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [C/C++]关于C++11中的std::move和std::forward