组合模式(Composite);将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
案例:一个系统,使得分公司的系统都具有总公司系统的功能。
代码结构图:
1:创建公司类的超类。
package CompositeModel; /** * 公司类,抽象类或者接口 * @author 我不是张英俊 * */ 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();//履行职责 }
2:具体公司类。树枝节点
package CompositeModel; import java.util.ArrayList; import java.util.List; /** * 具体公司类,实现接口,树枝节点 * @author 我不是张英俊 * */ public class ConcreteCompany extends Company { private List<Company> children=new ArrayList<Company>(); public ConcreteCompany(String name){ super(name); } @Override public void Add(Company c) { // TODO Auto-generated method stub children.add(c); } @Override public void Remove(Company c) { // TODO Auto-generated method stub children.remove(c); } @Override public void Display(int depth) { // TODO Auto-generated method stub char[] a={'-','-','-','-','-','-','-','-','-','-','-'}; System.out.println(new String (a,0,depth)+name); for(Company c:children){ c.Display(depth+2); } } @Override public void LineOfDuty() { // TODO Auto-generated method stub for(Company c:children){ c.LineOfDuty(); } } }
3:人力资源部类 树叶节点。
package CompositeModel; /** * 人力资源部 * @author 我不是张英俊 * */ public class HRDepartment extends Company { public HRDepartment(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void Add(Company c) { // TODO Auto-generated method stub } @Override public void Remove(Company c) { // TODO Auto-generated method stub } @Override public void Display(int depth) { // TODO Auto-generated method stub char[] a={'-','-','-','-','-','-','-','-','-','-','-'}; System.out.println(new String (a,0,depth)+name); } @Override public void LineOfDuty() { // TODO Auto-generated method stub System.out.println(name+"员工招聘培训管理"); } }
4:财务部类
package CompositeModel; public class FinanceDepartMent extends Company { public FinanceDepartMent(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void Add(Company c) { // TODO Auto-generated method stub } @Override public void Remove(Company c) { // TODO Auto-generated method stub } @Override public void Display(int depth) { // TODO Auto-generated method stub char[] a={'-','-','-','-','-','-','-','-','-','-','-'}; System.out.println(new String (a,0,depth)+name); } @Override public void LineOfDuty() { // TODO Auto-generated method stub System.out.println(name+"公司收支管理"); } }
5:测试类。
package CompositeModel; /** * 组合模式:将对象组合成树形结构以表示‘部分-整体’的层次结构。 * 组合模式使得用户对单个对象和组合对象的使用具有一致性。 * * * 案例模拟:总公司的系统,需要在各个分公司系统上都有总公司系统的功能。 * @author 我不是张英俊 * */ public class Test { public static void main(String[] args) { ConcreteCompany root=new ConcreteCompany("11111"); root.Add(new HRDepartment("11111人力资源部")); root.Add(new FinanceDepartMent("11111财务部")); ConcreteCompany comp=new ConcreteCompany("22222分公司"); comp.Add(new HRDepartment("22222人力资源部")); comp.Add(new FinanceDepartMent("22222财务部")); root.Add(comp); ConcreteCompany comp1=new ConcreteCompany("33333办事处"); comp1.Add(new HRDepartment("33333人力资源部")); comp1.Add(new FinanceDepartMent("33333财务处")); comp.Add(comp1); ConcreteCompany comp2=new ConcreteCompany("44444办事处"); comp2.Add(new HRDepartment("44444人力资源部")); comp2.Add(new FinanceDepartMent("44444财务部")); comp.Add(comp2); ConcreteCompany comp3=new ConcreteCompany("55555分公司"); comp3.Add(new HRDepartment("55555人力资源部")); comp3.Add(new FinanceDepartMent("55555财务部")); root.Add(comp3); System.out.println("******结构图*******"); root.Display(1); System.out.println("******职责图*******"); root.LineOfDuty(); } }
7:控制台
******结构图******* -11111 ---11111人力资源部 ---11111财务部 ---22222分公司 -----22222人力资源部 -----22222财务部 -----33333办事处 -------33333人力资源部 -------33333财务处 -----44444办事处 -------44444人力资源部 -------44444财务部 ---55555分公司 -----55555人力资源部 -----55555财务部 ******职责图******* 11111人力资源部员工招聘培训管理 11111财务部公司收支管理 22222人力资源部员工招聘培训管理 22222财务部公司收支管理 33333人力资源部员工招聘培训管理 33333财务处公司收支管理 44444人力资源部员工招聘培训管理 44444财务部公司收支管理 55555人力资源部员工招聘培训管理 55555财务部公司收支管理
总结:组合模式,使用基本的对象,组合成复杂的对象,一级一级的。而这个组合 对象又可以被组合,不断递归。
组合模式让用户可以一直的使用组合结构和单个对象。
自我理解:定义超类,不同等级的可同时实现超类,面对的是同一个超类,并通过实现 超类的子类的不同,可以不断的组合所需要的。