最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用組合模式實(shí)現(xiàn)表示公司組織結(jié)構(gòu)功能示例

 更新時(shí)間:2018年05月21日 10:37:55   作者:chengqiuming  
這篇文章主要介紹了Java使用組合模式實(shí)現(xiàn)表示公司組織結(jié)構(gòu)功能,簡(jiǎn)單描述了組合模式的概念、功能并結(jié)合實(shí)例形式分析了Java使用組合模式實(shí)現(xiàn)公司組織結(jié)構(gòu)表示功能具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Java使用組合模式實(shí)現(xiàn)表示公司組織結(jié)構(gòu)功能。分享給大家供大家參考,具體如下:

一、模式定義

組合模式:將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分一整體”的層次結(jié)構(gòu),組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

二、組合模式舉例

1 模式分析

我們借用公司組織結(jié)構(gòu)圖來(lái)說(shuō)明這一模式。

經(jīng)過(guò)分析后,我們得出該模式靜態(tài)類圖如下:

2 代碼示例

2.1 建立員工抽象類

package com.demo.composite;
/**
 * 職工類接口
 *
 * @author
 *
 */
public abstract class Staff {
  // 員工號(hào)
  protected String no;
  // 職工名字
  protected String name;
  // 職位
  protected String position;
  // 薪資
  protected float salary;
  // 私有屬性 長(zhǎng)度字符串
  private int length;
  // 構(gòu)造方法
  public Staff(String no, String name, String position, float salary) {
    this.no = no;
    this.name = name;
    this.position = position;
    this.salary = salary;
    // 計(jì)算總字節(jié)長(zhǎng)度
    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 創(chuàng)建管理者

package com.demo.composite.sub;
import java.util.ArrayList;
import com.demo.composite.Staff;
/**
 * 管理人員(手下有其他員工的人)
 *
 * @author
 *
 */
public class Manager extends Staff {
  // 存儲(chǔ)手下員工信息
  private final ArrayList<Staff> arrayList = new ArrayList<Staff>();
  // 構(gòu)造方法
  public Manager(String no, String name, String position, float salary) {
    super(no, name, position, salary);
  }
  /**
   * 增加一個(gè)員工
   */
  @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 創(chuàng)建普通員工

package com.demo.composite.sub;
import com.demo.composite.Staff;
/**
 * 普通員工(真正干活的人)
 *
 * @author
 *
 */
public class Employees extends Staff
{
  // 構(gòu)造方法
  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 客戶端測(cè)試

package com.demo;
import com.demo.composite.Staff;
import com.demo.composite.sub.Employees;
import com.demo.composite.sub.Manager;
/**
 * 主應(yīng)用程序
 *
 * @author
 *
 */
public class Client
{
  /**
   * @param args
   */
  public static void main(String[] args)
  {
    // 公司CEO
    Staff boss = new Manager("1", "大老板", "CEO", 100000);
    /**
     * CEO手下有若干部門經(jīng)理
     */
    // 財(cái)務(wù)部經(jīng)理
    Staff financeManager = new Manager("11", "張總", "財(cái)務(wù)部經(jīng)理", 60000);
    // 人事部經(jīng)理
    Staff personnelManager = new Manager("12", "王總", "人事部經(jīng)理", 60000);
    // 技術(shù)部經(jīng)理
    Staff technicalManager = new Manager("13", "陳總", "技術(shù)部經(jīng)理", 60000);
    /**
     * 技術(shù)部門還有助理和若干主管
     */
    // 技術(shù)部門助理
    Staff deptAssistant = new Manager("1301", "王助理", "部門助理", 20000);
    // 技術(shù)部門主管1
    Staff deptManager1 = new Manager("1302", "主管1", "技術(shù)主管", 30000);
    /**
     * 技術(shù)主管deptManager1 下面還有軟件工程師(最終干活的人)
     */
    Staff softwareEngineer1 = new Employees("1302001", "張三", "軟件工程師", 5000);
    Staff softwareEngineer2 = new Employees("1302002", "李四", "軟件工程師", 5500);
    Staff softwareEngineer3 = new Employees("1302003", "王五", "軟件工程師", 4500);
    // 為技術(shù)主管1添加員工信息
    deptManager1.add(softwareEngineer1);
    deptManager1.add(softwareEngineer2);
    deptManager1.add(softwareEngineer3);
    // 技術(shù)部門主管2
    Staff deptManager2 = new Manager("1303", "主管2", "技術(shù)主管", 30000);
    // 為技術(shù)部經(jīng)理 添加:部門助理、技術(shù)主管1和技術(shù)主管2
    technicalManager.add(deptAssistant);
    technicalManager.add(deptManager1);
    technicalManager.add(deptManager2);
    // 市場(chǎng)部經(jīng)理
    Staff marketingManager = new Manager("14", "吳總", "市場(chǎng)部經(jīng)理", 60000);
    // 為CEO 添加:財(cái)務(wù)部經(jīng)理、人事部經(jīng)理、技術(shù)部經(jīng)理和市場(chǎng)部經(jīng)理
    boss.add(financeManager);
    boss.add(personnelManager);
    boss.add(technicalManager);
    boss.add(marketingManager);
    // 打印CEO 信息
    boss.printUserBaseInfo();
    // 打印CEO 手下員工信息
    boss.printEmployeesInfo(1);
  }
}

運(yùn)行結(jié)果如下:

|1 大老板 CEO 100000.0
----|11 張總 財(cái)務(wù)部經(jīng)理 60000.0
----|12 王總 人事部經(jīng)理 60000.0
----|13 陳總 技術(shù)部經(jīng)理 60000.0
------|1301 王助理 部門助理 20000.0
------|1302 主管1 技術(shù)主管 30000.0
--------|1302001 張三 軟件工程師 5000.0
--------|1302002 李四 軟件工程師 5500.0
--------|1302003 王五 軟件工程師 4500.0
------|1303 主管2 技術(shù)主管 30000.0
----|14 吳總 市場(chǎng)部經(jīng)理 60000.0

三、該模式設(shè)計(jì)原則

1 統(tǒng)一對(duì)待個(gè)別對(duì)象和組合對(duì)象
2 面向抽象編程

四、使用場(chǎng)合

1 想表示對(duì)象的“部分一整體”層次結(jié)構(gòu)的時(shí)候。
2 希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一使用組合結(jié)構(gòu)中所有對(duì)象的時(shí)候。

組合模式的靜態(tài)類圖如下

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • JAVA文件讀寫操作詳解

    JAVA文件讀寫操作詳解

    這篇文章主要為大家詳細(xì)介紹了JAVA文件讀寫操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • 在IDEA中創(chuàng)建Web項(xiàng)目的詳細(xì)過(guò)程

    在IDEA中創(chuàng)建Web項(xiàng)目的詳細(xì)過(guò)程

    這篇文章主要給大家介紹了關(guān)于在IDEA中創(chuàng)建Web項(xiàng)目的詳細(xì)過(guò)程,很多朋友可能在學(xué)習(xí)java基礎(chǔ)的時(shí)候已經(jīng)熟練掌握了IDEA創(chuàng)建java項(xiàng)目的基本步驟,但隨著學(xué)習(xí)技術(shù)的不斷深入,不同的IDEA版本可能在項(xiàng)目的創(chuàng)建頁(yè)面上出現(xiàn)些許的出入,需要的朋友可以參考下
    2023-10-10
  • java實(shí)現(xiàn)Z字形掃描程序

    java實(shí)現(xiàn)Z字形掃描程序

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)Z字形掃描程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • Java根據(jù)日期截取字符串的多種實(shí)現(xiàn)方法

    Java根據(jù)日期截取字符串的多種實(shí)現(xiàn)方法

    在實(shí)際開發(fā)中,我們經(jīng)常會(huì)遇到需要根據(jù)日期來(lái)截取字符串的需求,例如從文件名中提取日期信息,Java 提供了多種方法來(lái)實(shí)現(xiàn)根據(jù)日期來(lái)截取字符串的功能,本文將給大家介紹了Java根據(jù)日期截取字符串的多種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2024-11-11
  • Java常用類之System類的使用指南

    Java常用類之System類的使用指南

    System類代表系統(tǒng),系統(tǒng)級(jí)的很多屬性和控制方法都放置在該類的內(nèi)部。該類位于java.lang包。本文將通過(guò)示例為大家詳細(xì)講講System類的使用,需要的可以參考一下
    2022-07-07
  • Java數(shù)據(jù)結(jié)構(gòu)之圖的兩種搜索算法詳解

    Java數(shù)據(jù)結(jié)構(gòu)之圖的兩種搜索算法詳解

    在很多情況下,我們需要遍歷圖,得到圖的一些性質(zhì)。有關(guān)圖的搜索,最經(jīng)典的算法有深度優(yōu)先搜索和廣度優(yōu)先搜索,接下來(lái)我們分別講解這兩種搜索算法,需要的可以參考一下
    2022-11-11
  • Java判斷一個(gè)實(shí)體是不是空的簡(jiǎn)單方法

    Java判斷一個(gè)實(shí)體是不是空的簡(jiǎn)單方法

    這篇文章主要給大家介紹了關(guān)于Java判斷一個(gè)實(shí)體是不是空的簡(jiǎn)單方法,實(shí)際項(xiàng)目中我們會(huì)有很多地方需要判空校驗(yàn),文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下
    2023-07-07
  • java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例

    java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例

    在項(xiàng)目開發(fā)中經(jīng)常用到,比如前端上送文件流(byte[])到后臺(tái)并轉(zhuǎn)成文件,本文主要介紹了java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Java面試題沖刺第十六天--消息隊(duì)列

    Java面試題沖刺第十六天--消息隊(duì)列

    這篇文章主要為大家分享了最有價(jià)值的三道關(guān)于消息隊(duì)列的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • java中的三種取整函數(shù)總結(jié)

    java中的三種取整函數(shù)總結(jié)

    下面小編就為大家?guī)?lái)一篇java中的三種取整函數(shù)總結(jié)。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦
    2016-11-11

最新評(píng)論

望江县| 防城港市| 浙江省| 淅川县| 洛南县| 临澧县| 泗阳县| 金湖县| 南康市| 宜阳县| 揭阳市| 五峰| 临朐县| 贞丰县| 陵水| 瑞昌市| 乌拉特后旗| 大余县| 金坛市| 双鸭山市| 凭祥市| 峨眉山市| 富民县| 张掖市| 天水市| 北碚区| 电白县| 武乡县| 永兴县| 漳浦县| 乌兰察布市| 台东市| 武陟县| 长葛市| 酉阳| 田阳县| 井研县| 仙居县| 墨脱县| 南昌市| 凌云县|