您好,登錄后才能下訂單哦!
怎么在Java中利用組合模式實現公司組織結構功能?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
一、模式定義
組合模式:將對象組合成樹形結構以表示“部分一整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。
二、組合模式舉例
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 希望用戶忽略組合對象與單個對象的不同,用戶將統一使用組合結構中所有對象的時候。
組合模式的靜態類圖如下
Java中的集合主要分為四類:1、List列表:有序的,可重復的;2、Queue隊列:有序,可重復的;3、Set集合:不可重復;4、Map映射:無序,鍵唯一,值不唯一。
看完上述內容,你們掌握怎么在Java中利用組合模式實現公司組織結構功能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。