《大话设计模式》第十九章
package ch19; public abstract class Company { protected String name; public Company(String name) { this.name = name; } public abstract void add(Company c); public abstract void remove(Company c); public abstract void display(int depth); public abstract void lineOfDuty(); }
package ch19; import java.util.LinkedList; import java.util.List; public class ConcreteCompany extends Company { private List<Company> children = new LinkedList<Company>(); public ConcreteCompany(String name) { super(name); } @Override public void add(Company c) { children.add(c); } @Override public void remove(Company c) { children.remove(c); } @Override public void display(int depth) { for (int i = 0; i < depth; i++) { System.out.print("-"); } System.out.println(name); for (int i = 0; i < children.size(); i++) { children.get(i).display(depth + 2); } } @Override public void lineOfDuty() { for (int i = 0; i < children.size(); i++) { children.get(i).lineOfDuty(); } } }
package ch19; public class FinanceDepartment extends Company { public FinanceDepartment(String name) { super(name); } @Override public void add(Company c) { } @Override public void remove(Company c) { } @Override public void display(int depth) { for (int i = 0; i < depth; i++) { System.out.print("-"); } System.out.println(name); } @Override public void lineOfDuty() { System.out.println(name + "\t公司财务收支管理"); } }
package ch19; public class HRDepartment extends Company { public HRDepartment(String name) { super(name); } @Override public void add(Company c) { } @Override public void remove(Company c) { } @Override public void display(int depth) { for (int i = 0; i < depth; i++) { System.out.print("-"); } System.out.println(name); } @Override public void lineOfDuty() { System.out.println(name + "\t员工招聘培训管理"); } }
package ch19; public class Client { /** * @param args */ public static void main(String[] args) { ConcreteCompany root = new ConcreteCompany("北京总公司"); root.add(new HRDepartment("总公司人力资源部")); root.add(new FinanceDepartment("总公司财务部")); ConcreteCompany comp = new ConcreteCompany("上海华东分公司"); comp.add(new HRDepartment("上海华东分公司人力资源部")); comp.add(new FinanceDepartment("上海华东分公司财务部")); root.add(comp); ConcreteCompany comp1 = new ConcreteCompany("南京办事处"); comp1.add(new HRDepartment("南京办事处人力资源部")); comp1.add(new FinanceDepartment("南京办事处财务部")); comp.add(comp1); ConcreteCompany comp2 = new ConcreteCompany("杭州办事处"); comp2.add(new HRDepartment("杭州办事处人力资源部")); comp2.add(new FinanceDepartment("杭州办事处财务部")); comp.add(comp2); System.out.println("结构图:"); root.display(1); System.out.println("职责图:"); root.lineOfDuty(); } }
运行:
结构图: -北京总公司 ---总公司人力资源部 ---总公司财务部 ---上海华东分公司 -----上海华东分公司人力资源部 -----上海华东分公司财务部 -----南京办事处 -------南京办事处人力资源部 -------南京办事处财务部 -----杭州办事处 -------杭州办事处人力资源部 -------杭州办事处财务部 职责图: 总公司人力资源部 员工招聘培训管理 总公司财务部 公司财务收支管理 上海华东分公司人力资源部 员工招聘培训管理 上海华东分公司财务部 公司财务收支管理 南京办事处人力资源部 员工招聘培训管理 南京办事处财务部 公司财务收支管理 杭州办事处人力资源部 员工招聘培训管理 杭州办事处财务部 公司财务收支管理
一看运行结果,看看代码,很好理解组合模式,上面的代码有点像是数据结构里的树。对象可以单个放进去,也可以组合起来后打包放进去。
JDK中的java.util.List的addAll和removeAll就是很经典的例子。