中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Java中利用組合模式實現公司組織結構功能

發布時間:2021-05-24 18:02:47 來源:億速云 閱讀:267 作者:Leah 欄目:編程語言

怎么在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有哪些集合類

Java中的集合主要分為四類:1、List列表:有序的,可重復的;2、Queue隊列:有序,可重復的;3、Set集合:不可重復;4、Map映射:無序,鍵唯一,值不唯一。

看完上述內容,你們掌握怎么在Java中利用組合模式實現公司組織結構功能的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

友谊县| 松滋市| 垫江县| 武胜县| 洛阳市| 思茅市| 庆元县| 长寿区| 凯里市| 沙田区| 朝阳区| 皋兰县| 张家界市| 安陆市| 甘南县| 赤峰市| 马尔康县| 青海省| 宝山区| 古交市| 宜宾市| 湖南省| 东辽县| 涟源市| 连南| 尚志市| 合山市| 庆阳市| 肇州县| 湘阴县| 潼南县| 犍为县| 中牟县| 新密市| 河南省| 赤峰市| 红桥区| 资阳市| 吉水县| 宣城市| 保亭|