Composite Pattern:意图是将对象组合成树形结构以表示部分-整体的层次结构,它使得用户对单个对象和组合对象的使用具有一致性。
下面以Iterator中的例子为例,不过,这里Department中除了含有Clerk外,也可以再含有子Department,它含有的子Department中也可以含有Clerk和Department,代码如下:
DepartComponent.java
package com.flyingh.abs; public abstract class DepartComponent { public void add(DepartComponent departComponent) { throw new UnsupportedOperationException(); } public void remove(DepartComponent departComponent) { throw new UnsupportedOperationException(); } public DepartComponent getChild(int i) { throw new UnsupportedOperationException(); } public abstract void print(); }
Clerk.java
package com.flyingh.bean; import com.flyingh.abs.DepartComponent; import com.flyingh.util.Sex; public class Clerk extends DepartComponent { private String id; private String name; private int age; private Sex sex; private float salary; public Clerk(String id, String name, int age, Sex sex, float salary) { super(); this.id = id; this.name = name; this.age = age; this.sex = sex; this.salary = salary; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Sex getSex() { return sex; } public void setSex(Sex sex) { this.sex = sex; } public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } @Override public String toString() { return "Clerk [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", salary=" + salary + "]"; } @Override public void print() { // TODO Auto-generated method stub System.out.println(this); } }
Sex.java
package com.flyingh.util; public enum Sex { man, woman; }
Depart.java
package com.flyingh.bean; import java.util.ArrayList; import java.util.List; import com.flyingh.abs.DepartComponent; public class Depart extends DepartComponent { private List<DepartComponent> list = new ArrayList<DepartComponent>(); public Depart(List<DepartComponent> list) { super(); this.list = list; } @Override public void add(DepartComponent departComponent) { // TODO Auto-generated method stub list.add(departComponent); } @Override public void remove(DepartComponent departComponent) { // TODO Auto-generated method stub list.remove(departComponent); } @Override public DepartComponent getChild(int i) { // TODO Auto-generated method stub return list.get(i); } @Override public void print() { // TODO Auto-generated method stub for (DepartComponent departComponent : list) { departComponent.print(); } } }
Boss.java
package com.flyingh.bean; import java.util.ArrayList; import java.util.List; import com.flyingh.abs.DepartComponent; public class Boss { private List<DepartComponent> allList = new ArrayList<DepartComponent>(); public Boss(List<DepartComponent> allList) { super(); this.allList = allList; } public void printAllClerk() { for (DepartComponent departComponent : allList) { departComponent.print(); } } }
Client.java
package com.flyingh.client; import java.util.ArrayList; import java.util.List; import com.flyingh.abs.DepartComponent; import com.flyingh.bean.Boss; import com.flyingh.bean.Clerk; import com.flyingh.bean.Depart; import com.flyingh.util.Sex; public class Client { public static void main(String[] args) { DepartComponent clerk1 = new Clerk("001", "zhangsan", 22, Sex.man, 8000); DepartComponent clerk2 = new Clerk("002", "lisi", 23, Sex.woman, 7788); DepartComponent clerkA1 = new Clerk("A1", "wangwuA", 25, Sex.man, 8800); DepartComponent clerkA2 = new Clerk("A2", "hahaA", 22, Sex.woman, 7878); List<DepartComponent> listA = new ArrayList<DepartComponent>(); listA.add(clerkA1); listA.add(clerkA2); DepartComponent departA = new Depart(listA); DepartComponent clerkB1 = new Clerk("B1", "wangwuB", 25, Sex.man, 8800); DepartComponent clerkB2 = new Clerk("B2", "hahaB", 22, Sex.woman, 7878); List<DepartComponent> subList = new ArrayList<DepartComponent>(); subList.add(new Clerk("subB1", "hehe", 21, Sex.man, 7000)); subList.add(new Clerk("subB2", "heihei", 23, Sex.man, 7788)); DepartComponent subDepartB = new Depart(subList); List<DepartComponent> listB = new ArrayList<DepartComponent>(); listB.add(clerkB1); listB.add(clerkB2); listB.add(subDepartB); DepartComponent departB = new Depart(listB); DepartComponent clerkC1 = new Clerk("C1", "wangwuC", 25, Sex.man, 8800); DepartComponent clerkC2 = new Clerk("C2", "hahaC", 22, Sex.woman, 7878); DepartComponent clerkC3 = new Clerk("C3", "heheC", 22, Sex.man, 7879); List<DepartComponent> listC = new ArrayList<DepartComponent>(); listC.add(clerkC1); listC.add(clerkC2); listC.add(clerkC3); DepartComponent departC = new Depart(listC); List<DepartComponent> allList = new ArrayList<DepartComponent>(); allList.add(clerk1); allList.add(clerk2); allList.add(departA); allList.add(departB); allList.add(departC); Boss boss = new Boss(allList); boss.printAllClerk(); } }
程序运行结果如下:
Clerk [id=001, name=zhangsan, age=22, sex=man, salary=8000.0] Clerk [id=002, name=lisi, age=23, sex=woman, salary=7788.0] Clerk [id=A1, name=wangwuA, age=25, sex=man, salary=8800.0] Clerk [id=A2, name=hahaA, age=22, sex=woman, salary=7878.0] Clerk [id=B1, name=wangwuB, age=25, sex=man, salary=8800.0] Clerk [id=B2, name=hahaB, age=22, sex=woman, salary=7878.0] Clerk [id=subB1, name=hehe, age=21, sex=man, salary=7000.0] Clerk [id=subB2, name=heihei, age=23, sex=man, salary=7788.0] Clerk [id=C1, name=wangwuC, age=25, sex=man, salary=8800.0] Clerk [id=C2, name=hahaC, age=22, sex=woman, salary=7878.0] Clerk [id=C3, name=heheC, age=22, sex=man, salary=7879.0]