首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 面向對象設計實戰:部門-人員-公司三級建模與遞歸部門樹

     編輯:Java 綜合教學

Java 面向對象設計實戰:部門-人員-公司三級建模與遞歸部門樹

「紙上得來終覺淺,絕知此事要躬行。」本文提供兩道經典 OO 設計練習,涵蓋基礎建模與遞歸樹結構,適合新手上機實戰。

練習 1:部門-人員-公司核心域模型

領域類定義

// Department.java
public class Department {
    private String name;
    // getter/setter
}

// Employee.java
public class Employee {
    private String name, id, phone;
    private Department department;
    public Employee(Department dept) { this.department = dept; }
    public void display() {
        System.out.printf("%s(%s) %s 電話:%s%n", name, id, department.getName(), phone);
    }
    // getter/setter
}

// Company.java
public class Company {
    private List<Department> departments = new ArrayList<>();
    private List<Employee> employees = new ArrayList<>();

    public void addEmployee(Employee e) { employees.add(e); }
    public Employee findByName(String name) { ... }
    public Employee findByPhone(String phone) { ... }
    public Department findDeptByName(String name) { ... }
    public Employee findInDeptByName(String deptName, String name) { ... }
    public Employee findInDeptByPhone(String deptName, String phone) { ... }
}

設計要點

  • 公司聚合部門與員工,使用 List 實現動態擴容。
  • 查詢方法體現「導航性」:公司→員工、公司→部門→員工。
  • 構造器注入所屬部門,保證關聯完整性。

練習 2:多層級遞歸部門樹(支援 5+ 層)

DepartmentTree 類設計

public class DepartmentTree {
    private String name;
    private DepartmentTree parent;
    private List<DepartmentTree> children = new ArrayList<>();
    private int level;           // 1=根, 2=分公司, 3=部門...
    private boolean hasChildren;

    public DepartmentTree(String name, DepartmentTree parent) {
        this.name = name;
        this.parent = parent;
        this.level = (parent == null) ? 1 : parent.level + 1;
        if (parent != null) {
            parent.children.add(this);
            parent.hasChildren = true;
        }
    }

    public String getFullName() {
        return (parent == null) ? name : parent.getFullName() + "," + name;
    }
    public boolean hasChild(String childName) {
        return children.stream().anyMatch(c -> c.name.equals(childName));
    }
    // getter: name, level, hasChildren, parent
}

測試用例

public static void main(String[] args) {
    DepartmentTree root = new DepartmentTree("總公司", null);
    DepartmentTree sjz = new DepartmentTree("石家莊分公司", root);
    DepartmentTree plan = new DepartmentTree("計劃部", sjz);
    DepartmentTree purch = new DepartmentTree("採購中心", plan);
    DepartmentTree term = new DepartmentTree("終端設備採購科", purch);

    System.out.println(term.getFullName());
    // 輸出: 總公司,石家莊分公司,計劃部,採購中心,終端設備採購科
    System.out.println(term.level); // 5
    System.out.println(purch.hasChildren); // true
}

進階思考

  1. 雙向導航:子節點持有父引用,父節點持有子集合,構建雙向鏈路。
  2. 層級自動計算:構造器中根據父層級 +1 推導,避免手動維護錯誤。
  3. 全路徑構建:遞歸向上拼接 getFullName(),O(depth) 時間複雜度。
  4. 擴展點:可增加 moveSubtree()、findByPath()、toJSON() 等樹操作。

這兩道題看似簡單,實則考驗領域建模能力、集合操作熟練度與遞歸思維。建議:先寫測試,再實現類,體驗 TDD 節奏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved