http://www.books.com.tw/products/0010750585
chap13.
合成模式 Composite
目的:處理樹狀結構資料
package com.ssc24.chap13.demo01;
public abstract class AbstractAssociation {
protected String name;
public AbstractAssociation(String name) {
this.name = name;
}
public abstract void add(AbstractAssociation a);
public abstract void remove(AbstractAssociation a);
public abstract void display(int depth);
public abstract void lineOfDute();
}
package com.ssc24.chap13.demo01;
import java.util.ArrayList;
import java.util.List;
public class Association extends AbstractAssociation {
private List<AbstractAssociation> branchs = new ArrayList<AbstractAssociation>();
public Association(String name) {
super(name);
}
@Override
public void add(AbstractAssociation a) {
branchs.add(a);
}
@Override
public void remove(AbstractAssociation a) {
branchs.remove(a);
}
@Override
public void display(int depth) {
for (int i =0 ; i < depth ; i++) {
System.out.print("-");
}
System.out.println(name);
for (AbstractAssociation a : branchs) {
a.display(depth + 1);
}
//System.out.println("|");
}
@Override
public void lineOfDute() {
for (AbstractAssociation a : branchs) {
a.lineOfDute();
}
}
}
package com.ssc24.chap13.demo01;
public abstract class Department extends AbstractAssociation {
public Department(String name) {
super(name);
}
@Override
public void add(AbstractAssociation a) {
System.out.println("Leaf無法增加子節點");
}
@Override
public void remove(AbstractAssociation a) {
System.out.println("Leaf無子節點可以移除");
}
@Override
public void display(int depth) {
for (int i =0 ; i < depth ; i++) {
System.out.print("-");
}
//System.out.println("*");
System.out.println(name);
}
@Override
public abstract void lineOfDute();
}
package com.ssc24.chap13.demo01;
public class HumanResouce extends Department {
public HumanResouce(String name) {
super(name);
}
@Override
public void lineOfDute() {
System.out.println(name + " :想辦法拐騙冒險者來完成任務");
}
}
package com.ssc24.chap13.demo01;
public class ServiceDepartment extends Department {
public ServiceDepartment(String name) {
super(name);
}
@Override
public void lineOfDute() {
System.out.println(name + " :處理客訴,告訴客戶,這肯定是冒險者的錯,不是協會的錯");
}
}
package com.ssc24.chap13.demo01;
import static org.junit.Assert.*;
import org.junit.Test;
public class BranchOrganizationTest {
@Test
public void test() {
System.out.println("===合成模式測試===");
AbstractAssociation root = new Association("冒險者總會");
root.add(new HumanResouce("總會-人力資源單位"));
root.add(new ServiceDepartment("總會-客服單位"));
AbstractAssociation mars = new Association("火星分會");
mars.add(new HumanResouce("火星分會-人力資源單位"));
mars.add(new ServiceDepartment("火星分會-客服單位"));
root.add(mars);
AbstractAssociation saturn = new Association("土星分會");
saturn.add(new HumanResouce("土星分會-人力資源單位"));
saturn.add(new ServiceDepartment("土星分會-客服單位"));
root.add(saturn);
AbstractAssociation m1 = new Association("土衛1號辦事處");
m1.add(new HumanResouce("土衛1號辦事處-人力資源單位"));
m1.add(new ServiceDepartment("土衛1號辦事處-客服單位"));
saturn.add(m1);
AbstractAssociation m2 = new Association("土衛2號辦事處");
m2.add(new HumanResouce("土衛2號辦事處-人力資源單位"));
saturn.add(m2);
System.out.println("結構圖:");
root.display(1);
System.out.println();
System.out.println("職責表");
root.lineOfDute();
System.out.println();
AbstractAssociation root2 = new HumanResouce("測試1");
root2.remove(m2);
}
} /** ===合成模式測試=== 結構圖: -冒險者總會 --總會-人力資源單位 --總會-客服單位 --火星分會 ---火星分會-人力資源單位 ---火星分會-客服單位 --土星分會 ---土星分會-人力資源單位 ---土星分會-客服單位 ---土衛1號辦事處 ----土衛1號辦事處-人力資源單位 ----土衛1號辦事處-客服單位 ---土衛2號辦事處 ----土衛2號辦事處-人力資源單位 職責表 總會-人力資源單位 :想辦法拐騙冒險者來完成任務 總會-客服單位 :處理客訴,告訴客戶,這肯定是冒險者的錯,不是協會的錯 火星分會-人力資源單位 :想辦法拐騙冒險者來完成任務 火星分會-客服單位 :處理客訴,告訴客戶,這肯定是冒險者的錯,不是協會的錯 土星分會-人力資源單位 :想辦法拐騙冒險者來完成任務 土星分會-客服單位 :處理客訴,告訴客戶,這肯定是冒險者的錯,不是協會的錯 土衛1號辦事處-人力資源單位 :想辦法拐騙冒險者來完成任務 土衛1號辦事處-客服單位 :處理客訴,告訴客戶,這肯定是冒險者的錯,不是協會的錯 土衛2號辦事處-人力資源單位 :想辦法拐騙冒險者來完成任務 Leaf無子節點可以移除 **/