一 模式定义
组合模式:将对象组合成树形结构以表示“部分一整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
二 组合模式举例
1 模式分析
我们借用公司组织结构图来说明这一模式。
经过分析后,我们得出该模式静态类图如下:
2代码示例
2.1建立员工抽象类
package com.demo.composite; /** * 职工类接口 * * @author * */ public abstract class Staff { // 员工号 protected String no; // 职工名字 protected String name; // 职位 protected String position; // 薪资 protected float salary; // 私有属性 长度字符串 private int length; // 构造方法 public Staff(String no, String name, String position, float salary) { this.no = no; this.name = name; this.position = position; this.salary = salary; // 计算总字节长度 this.length += (no == null || "".equals(no.trim())) ? 0 : no.getBytes().length; this.length += (name == null || "".equals(name.trim())) ? 0 : name .getBytes().length; this.length += (position == null || "".equals(position.trim())) ? 0 : position.getBytes().length; this.length += String.valueOf(salary).getBytes().length; } // 获得用户基本信息 public void printUserBaseInfo() { System.out.println("|" + this.no + " " + this.name + " " + this.position + " " + this.salary); } // 添加员工信息 public abstract void add(Staff staff); // 删除员工 public abstract Staff remove(String no); // 打印员工信息 public abstract void printEmployeesInfo(int layer); // 打印若干字符 protected void printChar(int layer) { for (int j = 0; j < layer * 2; j++) { System.out.print("-"); } } // 私有方法打印一行 protected void printLine() { System.out.print("+"); for (int i = 0; i < this.length + 4; i++) { System.out.print("-"); } System.out.println("-"); } public String getNo() { return no; } public void setNo(String no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } }
2.2 创建管理者
package com.demo.composite.sub; import java.util.ArrayList; import com.demo.composite.Staff; /** * 管理人员(手下有其他员工的人) * * @author * */ public class Manager extends Staff { // 存储手下员工信息 private final ArrayList<Staff> arrayList = new ArrayList<Staff>(); // 构造方法 public Manager(String no, String name, String position, float salary) { super(no, name, position, salary); } /** * 增加一个员工 */ @Override public void add(Staff staff) { this.arrayList.add(staff); } /** * 删除员工信息 */ @Override public Staff remove(String no) { Staff staff = null; if (no != null && !"".equals(no.trim())) { for (int i = 0; i < this.arrayList.size(); i++) { if (this.arrayList.get(i) == null) { continue; } if (no.equals(this.arrayList.get(i).getNo())) { staff = this.arrayList.remove(i); break; } } } return staff; } /** * 打印员工信息 */ @Override public void printEmployeesInfo(int layer) { int tmpLayer = ++layer; for (int i = 0; i < this.arrayList.size(); i++) { if (this.arrayList.get(i) == null) { continue; } // 打印'-' printChar(tmpLayer); // 打印员工基本信息 this.arrayList.get(i).printUserBaseInfo(); // 打印手下员工信息 this.arrayList.get(i).printEmployeesInfo(tmpLayer); } } }
2.3创建普通员工
package com.demo.composite.sub; import com.demo.composite.Staff; /** * 普通员工(真正干活的人) * * @author * */ public class Employees extends Staff { // 构造方法 public Employees(String no, String name, String position, float salary) { super(no, name, position, salary); } /** * 添加员工信息 */ @Override public void add(Staff staff) { return; } /** * 删除员工信息 */ @Override public Staff remove(String no) { // 直接返回null return null; } /** * 打印员工信息 */ @Override public void printEmployeesInfo(int layer) { return; } }
2.4客户端测试
package com.demo; import com.demo.composite.Staff; import com.demo.composite.sub.Employees; import com.demo.composite.sub.Manager; /** * 主应用程序 * * @author * */ public class Client { /** * @param args */ public static void main(String[] args) { // 公司CEO Staff boss = new Manager("1", "大老板", "CEO", 100000); /** * CEO手下有若干部门经理 */ // 财务部经理 Staff financeManager = new Manager("11", "张总", "财务部经理", 60000); // 人事部经理 Staff personnelManager = new Manager("12", "王总", "人事部经理", 60000); // 技术部经理 Staff technicalManager = new Manager("13", "陈总", "技术部经理", 60000); /** * 技术部门还有助理和若干主管 */ // 技术部门助理 Staff deptAssistant = new Manager("1301", "王助理", "部门助理", 20000); // 技术部门主管1 Staff deptManager1 = new Manager("1302", "主管1", "技术主管", 30000); /** * 技术主管deptManager1 下面还有软件工程师(最终干活的人) */ Staff softwareEngineer1 = new Employees("1302001", "张三", "软件工程师", 5000); Staff softwareEngineer2 = new Employees("1302002", "李四", "软件工程师", 5500); Staff softwareEngineer3 = new Employees("1302003", "王五", "软件工程师", 4500); // 为技术主管1添加员工信息 deptManager1.add(softwareEngineer1); deptManager1.add(softwareEngineer2); deptManager1.add(softwareEngineer3); // 技术部门主管2 Staff deptManager2 = new Manager("1303", "主管2", "技术主管", 30000); // 为技术部经理 添加:部门助理、技术主管1和技术主管2 technicalManager.add(deptAssistant); technicalManager.add(deptManager1); technicalManager.add(deptManager2); // 市场部经理 Staff marketingManager = new Manager("14", "吴总", "市场部经理", 60000); // 为CEO 添加:财务部经理、人事部经理、技术部经理和市场部经理 boss.add(financeManager); boss.add(personnelManager); boss.add(technicalManager); boss.add(marketingManager); // 打印CEO 信息 boss.printUserBaseInfo(); // 打印CEO 手下员工信息 boss.printEmployeesInfo(1); } }
运行结果如下:
|1 大老板 CEO 100000.0
----|11 张总 财务部经理 60000.0
----|12 王总 人事部经理 60000.0
----|13 陈总 技术部经理 60000.0
------|1301 王助理 部门助理 20000.0
------|1302 主管1 技术主管 30000.0
--------|1302001 张三 软件工程师 5000.0
--------|1302002 李四 软件工程师 5500.0
--------|1302003 王五 软件工程师 4500.0
------|1303 主管2 技术主管 30000.0
----|14 吴总 市场部经理 60000.0
三 该模式设计原则
1 统一对待个别对象和组合对象
2 面向抽象编程
四 使用场合
1 想表示对象的“部分一整体”层次结构的时候。
2 希望用户忽略组合对象与单个对象的不同,用户将统一使用组合结构中所有对象的时候。
组合模式的静态类图如下
相关推荐
责任模式部分可能涉及到团体、组织层次、组织结构和责任等概念。该模式着重于描述组织内责任的分配、责任知识的组合以及团体类型的变化等。还可能讨论了责任层次的模式、操作范围以及职务的角色。 2.2 观察和测量...
互联网下物业运营新模式——“组合式”物业的设想与构造,反映了随着大数据和云计算技术的不断发展,智慧社区成为物业公司发展的一个新方向。传统物业服务模式存在一些问题,如物业公司提供的基础服务质量不到位,...
结构型模式包括但不限于适配器模式、桥接模式、组合模式等。通过这些模式的应用,可以使系统结构更加清晰,易于理解和维护。 #### 第四部分:行为型模式 这部分关注于应用运行过程中算法的提供和通信关系的梳理。...
组合模式是一种设计模式,它将对象组织成树形结构,使得用户可以统一处理单个对象和对象集合。在本实验中,我们将深入探讨组合模式的原理、实现方式以及其在实际编程中的应用。 首先,我们要理解组合模式的核心概念...
- **组合模式**:将对象组合成树形结构以表示“部分-整体”的层次结构。 - **享元模式**:运用共享技术有效地支持大量细粒度的对象。 ### 行为型模式 行为型模式关注类的职责分配以及对象之间的交互。 - **策略...
本文将探讨其中的一种——组合模式,它在处理具有层次结构的数据时尤为有效。 #### 二、公司人事架构示例 以公司的人事架构为例,通常会形成一种树状结构,这种结构中包含两种不同类型的节点:树枝节点和树叶节点。...
《Tcl/Tk组合教程——双语教材+多媒体教室》是一本深入浅出地探讨Tcl和Tk编程的宝贵资源。Tcl(Tool Command Language)是一种动态编程语言,以其简洁的语法和强大的脚本能力而著称。Tk则是Tcl的图形用户界面(GUI)...
通过组合模式,我们可以构建灵活、易于维护的代码结构,特别是在处理树形数据结构时,如文件系统、组织结构图等。同时,它还有助于实现开闭原则——对扩展开放,对修改关闭,因为新的对象类型可以通过简单地添加新类...
数据结构与算法是计算机科学的基础,而面向对象的C++设计模式则是软件工程中的核心概念。这个主题结合了这两者,旨在提供一个深入理解如何在实际编程中有效地组织和优化数据的方法。 首先,数据结构是关于如何存储...
**实验二:组合模式——空军指挥系统** 组合模式用于将对象组织成树形结构,使用户能够以一致的方式处理单个对象和对象集合。在空军指挥系统的例子中,组合模式可能用于表示不同级别的指挥单元,如空军基地、飞行...
本篇主要探讨的是结构型模式之一——组合模式。 #### 二、组合模式定义 组合模式(Composite Pattern)是一种树形结构的设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户可以对...
方大集团的组织结构优化调整及管控体系设计报告主要探讨了集团在面对企业发展壮大后如何构建有效的管控模式,以确保战略落地、业务协同和资源高效利用。报告提到了管控模式的三个方面:战略导向、静态组织结构和动态...
- 组合模式:允许你将对象组合成树形结构,以表现“部分-整体”的层次结构。 - 装饰模式:动态地给一个对象添加一些额外的职责。 - 外观模式:提供一个统一的接口,用来访问子系统中的多个接口。 - 代理模式:为...
2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种...
组合模式使得用户对单个对象和组合对象的使用具有一致性。 4. **装饰器模式**(Decorator Pattern): - 动态地给一个对象添加一些额外的职责。就增加功能而言,装饰器模式相比生成子类更加灵活。 5. **外观模式*...
首先,大规模协作是新组织结构的核心,它打破了传统的专职翻译、众包翻译和兼职翻译的界限,引入了组合式创新的概念。专职翻译保持专业水准,众包翻译利用大众智慧,兼职翻译则提供灵活资源,三者结合可以快速响应...
人工智能领域的深度学习是从人工神经网络的研究中发展出来的,它关注于通过低层特征组合来形成更高级别的抽象属性类别或特征,以此发现数据的分布式特征表示。尽管教育领域的深度学习概念与人工智能中的有所不同,但...
《23种设计模式——结构型模式解析》 设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,被广泛应用于软件设计中,以提高代码的可读性、可维护性和复用性。在众多的设计模式中,结构型模式尤其...