組合模式:將對象組合成樹形結構。
案例:公司管理。一個公司可以分總公司和分公司,無論是總公司還是分公司都有自己的部門,如人力資源管理部門、財務部門。分公司可以建立自己在不同地域的辦事處。請使用組合模式打印出某個公司的結構。?
package Composite;abstract class Company {private String name;public Company(String name) {this.name = name;}public String getName() {return name;}public abstract void add(Company company);public abstract void remove(Company company);public abstract void display(int depth);public abstract void lineOfDuty();}
package Composite;import java.util.ArrayList;
import java.util.List;public class ConcreteCompanty extends Company{private List<Company> children = new ArrayList<>();public ConcreteCompanty(String name) {super(name);}@Overridepublic void add(Company company) {children.add(company);}@Overridepublic void remove(Company company) {children.remove(company);}@Overridepublic void display(int depth) {for(int i=0;i<depth;i++)System.out.print("-");System.out.println(this.getName());for(Company company : children) {company.display(depth + 2);}}@Overridepublic void lineOfDuty() {}
}
package Composite;public class FinanceDepartment extends Company{public FinanceDepartment(String name) {super(name);}@Overridepublic void add(Company company) {}@Overridepublic void remove(Company company) {}@Overridepublic void display(int depth) {for(int i=0;i<depth;i++)System.out.print("-");System.out.println(this.getName());}@Overridepublic void lineOfDuty() {}
}
package Composite;public class HRDepartment extends Company{public HRDepartment(String name) {super(name);}@Overridepublic void add(Company company) {}@Overridepublic void remove(Company company) {}@Overridepublic void display(int depth) {for(int i=0;i<depth;i++)System.out.print("-");System.out.println(this.getName());}@Overridepublic void lineOfDuty() {}
}
package Composite;public class Client {public static void main(String[] args) {ConcreteCompanty root = new ConcreteCompanty("總公司");root.add(new HRDepartment("總公司人力資源部"));root.add(new FinanceDepartment("總公司財務部"));ConcreteCompanty comp = new ConcreteCompanty("分公司1");comp.add(new HRDepartment("分公司1人力資源部"));comp.add(new FinanceDepartment("分公司1財務部"));ConcreteCompanty comp1 = new ConcreteCompanty("分公司1辦事處A");comp1.add(new HRDepartment("分公司1辦事處人力資源部"));comp1.add(new FinanceDepartment("分公司1辦事處財務部"));ConcreteCompanty comp2 = new ConcreteCompanty("分公司1辦事處B");comp2.add(new HRDepartment("分公司1辦事處B人力資源部"));comp2.add(new FinanceDepartment("分公司1辦事處B財務部"));comp.add(comp1);comp.add(comp2);root.add(comp);ConcreteCompanty compt = new ConcreteCompanty("分公司2");compt.add(new HRDepartment("分公司2人力資源部"));compt.add(new FinanceDepartment("分公司2財務部"));root.add(compt);root.display(1);}
}