Java使用组合模式实现表示公司组织结构功能示例

作者:chengqiuming 时间:2022-07-31 08:03:37 

本文实例讲述了Java使用组合模式实现表示公司组织结构功能。分享给大家供大家参考,具体如下:

一、模式定义

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

二、组合模式举例

1 模式分析

我们借用公司组织结构图来说明这一模式。

经过分析后,我们得出该模式静态类图如下:

Java使用组合模式实现表示公司组织结构功能示例

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 希望用户忽略组合对象与单个对象的不同,用户将统一使用组合结构中所有对象的时候。

组合模式的静态类图如下

Java使用组合模式实现表示公司组织结构功能示例

希望本文所述对大家java程序设计有所帮助。

来源:https://blog.csdn.net/chengqiuming/article/details/70139251

标签:Java,组合模式
0
投稿

猜你喜欢

  • java生成jar包并且单进程运行的实例

    2021-08-30 00:40:55
  • 解析Java中的static关键字

    2022-03-02 17:15:35
  • 解决Maven中关于依赖导入不进的问题

    2023-09-05 23:13:08
  • 详解Java Selenium中的鼠标控制操作

    2023-11-23 14:43:17
  • mybatis-plus的批量新增/批量更新以及问题

    2022-10-28 04:44:16
  • Android ViewDragHelper使用介绍

    2023-08-01 04:18:59
  • Hibernate的一对一,一对多/多对一关联保存的实现

    2022-03-13 12:41:08
  • IDEA如何自动生成serialVersionUID的设置

    2023-08-09 04:00:33
  • java设计模式学习之工厂方法模式

    2023-10-12 17:19:04
  • Jenkins节点配置实现原理及过程解析

    2023-02-14 11:53:30
  • Dubbo Consumer引用服务示例代码详解

    2022-04-26 03:56:44
  • Java Map集合用法详解

    2023-08-01 14:47:01
  • jenkins+maven+svn自动部署和发布的详细图文教程

    2023-08-24 05:18:07
  • Spring中多配置文件及引用其他bean的方式

    2023-07-01 17:31:03
  • Java如何使用ReentrantLock实现长轮询

    2023-11-26 00:09:08
  • spring中bean id相同引发故障的分析与解决

    2023-08-05 11:30:41
  • Sharding-Proxy基本功能用法介绍

    2021-10-17 06:41:03
  • 辨析Java中的String与StringBuffer及StringBuilder字符串类

    2023-08-21 19:59:50
  • Java的JDBC中Statement与CallableStatement对象实例

    2022-11-14 17:22:08
  • synchronized及JUC显式locks 使用原理解析

    2023-08-05 03:28:41
  • asp之家 软件编程 m.aspxhome.com