一 模式定义
组合模式:将对象组合成树形结构以表示“部分一整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

二 组合模式举例
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);}/*** 增加一个员工*/@Overridepublic void add(Staff staff) {this.arrayList.add(staff);}/*** 删除员工信息*/@Overridepublic 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;}/*** 打印员工信息*/@Overridepublic 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);}/*** 添加员工信息*/@Overridepublic void add(Staff staff){return;}/*** 删除员工信息*/@Overridepublic Staff remove(String no){// 直接返回nullreturn null;}/*** 打印员工信息*/@Overridepublic 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){// 公司CEOStaff 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);// 技术部门主管1Staff 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);// 技术部门主管2Staff deptManager2 = new Manager("1303", "主管2", "技术主管", 30000);// 为技术部经理 添加:部门助理、技术主管1和技术主管2technicalManager.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 希望用户忽略组合对象与单个对象的不同,用户将统一使用组合结构中所有对象的时候。
组合模式的静态类图如下

转载于:https://www.cnblogs.com/ainima/p/6331677.html

组合模式——公司组织结构相关推荐

  1. 梳理公司的组织架构 --- 组合模式

    题外话 本来是周更的频率, 因为真实的"小光"真实地逃离了北京, 回了武汉, 回了老家, 处理了一些私人事务. 也就有快一个月时间没有更新了, 抱歉. 年终总结也都没有时间写, 抽 ...

  2. 大话设计模式之爱你一万年:第十章 结构型模式:组合模式:爱如此简单:2.组合模式之公司部门管理

    有了<组合模式>的这个设计,那么我女朋友的公司管理系统就容易实现了. 接下来,让我大展拳脚,来面对疾风吧. 一.组合模式之公司管理分析 1.1 分析 根据组合模式的概念,我们对应的角色都是 ...

  3. 组合模式用于分类设计子叶与枝干时候太好用了

    http://www.blogjava.net/flustar/archive/2007/12/18/composite.html 这篇文章说的很好 其实组合模式就是为了让客户端调用程序简洁,不用实现 ...

  4. 1、【设计模式】组合模式

    java设计模式之组合模式 [学习难度:★★★☆☆,使用频率:★★★★☆]  树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式 ...

  5. 设计模式学习笔记(十一)-组合模式

    树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得 ...

  6. 设计模式GOF23之-------------------结构型模式(适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式)

    一 结构型模式 二 适配器模式 下面我将用代码模拟键盘usb接口和ps/2的转接器 的适配器过程: 首先定义客户需求: package GOF23;public interface Target {v ...

  7. 组合模式-Composite Pattern

    目录 组合模式的定义与特点 组合模式的结构与实现 组合模式的应用实例 组合模式的应用场景 组合模式的扩展 树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构 ...

  8. 树形结构的处理——组合模式(五)

    11.5 公司组织结构 在学习和使用组合模式时,Sunny软件公司开发人员发现树形结构其实随处可见,例如Sunny公司的组织结构就是"一棵标准的树",如图11-8所示: 图11-8 ...

  9. 组合模式 -- 树形结构处理

    树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得 ...

  10. 设计模式-04.02-结构型设计模式-门面模式组合模式享元模式

    文章目录 门面模式(外观模式)[不常用] 门面模式的原理与实现 Demo案例-影院管理 传统方案 门面模式代码 TheaterLight Stereo Screen Projector Popcorn ...

最新文章

  1. notepad++ 输入中文无响应
  2. 成都华育php笔试题,一套PHP的笔试题
  3. Sublime Text 3中文乱码问题的解决(最有效)
  4. c++连接mongodb出错
  5. 全景摄像技术大有可为
  6. string转换成enum
  7. 当飞猪遇上 Serverless | 云原生 Talk
  8. tomcat:sessionId生成机制导致tomcat启动过慢问题
  9. 【Pytorch】 .item()==>得到元素张量里面的一个元素值,便可以循环、查看...操作
  10. 关于 Android Service 的介绍都在这了
  11. 第五天:在博客路由中使用登录验证,配置 nginx解决前后端跨域
  12. oracle财务软件凭证打印,ORACLE财务软件简明操作文档.doc
  13. PHP环境配置遇到的问题与解决
  14. 服务器cpu e系列和x系列,英特尔至强cpu,x系列和e系列哪个更好?
  15. 优化-处理大量定时任务的思路
  16. Android挂载系统分区执行mount和remount
  17. 高新技术计算机应用能力考试,全国计算机信息高新技术考试(OSTA)-人社部职业资格证书...
  18. 【单片机毕业设计】【mcuclub-jj-027】基于单片机的电子秤的设计
  19. Linux/Windos搭建安装Kaldi环境实现ASR语音识别
  20. 邵奈一的技术博客导航

热门文章

  1. Linux—添加开机启动(服务/脚本)
  2. Mac下ssh连接远程服务器时自动断开问题
  3. 处理整个磁盘镜像文件的单个分区
  4. iframe 自适应内容高度
  5. Theano学习笔记:Theano的艰辛安装体验
  6. 自定义view imageviw
  7. Python之认识世界
  8. 父子类之间,成员函数重写、重载以及重定义的区别
  9. DAG镶嵌模型+原始路径打印
  10. linux中文显示和输入