「紙上得來終覺淺,絕知此事要躬行。」本文提供兩道經典 OO 設計練習,涵蓋基礎建模與遞歸樹結構,適合新手上機實戰。
// 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 實現動態擴容。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
}
getFullName(),O(depth) 時間複雜度。moveSubtree()、findByPath()、toJSON() 等樹操作。這兩道題看似簡單,實則考驗領域建模能力、集合操作熟練度與遞歸思維。建議:先寫測試,再實現類,體驗 TDD 節奏。