http://www.books.com.tw/products/0010750585
chap25.
拜訪者模式 Visitor
目的:用不同的拜訪者使集合(Collection)中的元素行為與元素類別切離。
package com.ssc24.chap25.demo01;
public abstract class Chef {
private String name;
public Chef(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void acept(Visitor visitor);
}
package com.ssc24.chap25.demo01;
public class DarkChef extends Chef {
public DarkChef(String name) {
super(name);
}
@Override
public void acept(Visitor visitor) {
visitor.cook(this);
}
}
package com.ssc24.chap25.demo01;
public class SuperChef extends Chef {
public SuperChef(String name) {
super(name);
}
@Override
public void acept(Visitor visitor) {
visitor.cook(this);
}
}
package com.ssc24.chap25.demo01;
public class SuperNoodleChef extends Chef {
public SuperNoodleChef(String name) {
super(name);
}
@Override
public void acept(Visitor visitor) {
visitor.cook(this);
}
}
package com.ssc24.chap25.demo01;
public interface Visitor {
void cook(DarkChef chef);
void cook(SuperChef chef);
void cook(SuperNoodleChef chef);
}
package com.ssc24.chap25.demo01;
public class Visitor_saoMai implements Visitor {
@Override
public void cook(DarkChef chef) {
System.out.println(chef.getName() + ":魔幻鴉片燒賣");
}
@Override
public void cook(SuperChef chef) {
System.out.println(chef.getName() + ":宇宙大燒賣");
}
@Override
public void cook(SuperNoodleChef chef) {
System.out.println(chef.getName() + ":鐵桿50人份燒賣");
}
}
package com.ssc24.chap25.demo01;
public class Visitor_tofu implements Visitor {
@Override
public void cook(DarkChef chef) {
System.out.println(chef.getName() + ":豆腐三重奏");
}
@Override
public void cook(SuperChef chef) {
System.out.println(chef.getName() + ":貓熊豆腐");
}
@Override
public void cook(SuperNoodleChef chef) {
System.out.println(chef.getName() + ":鐵桿臭豆腐");
}
}
package com.ssc24.chap25.demo01;
import java.util.ArrayList;
import java.util.List;
public class ChefGroup {
private List<Chef> list = new ArrayList<>();
public void join (Chef chef) {
list.add(chef);
}
public void leave (Chef chef) {
list.remove(chef);
}
public void topic (Visitor visitor) {
for (Chef chef : list) {
chef.acept(visitor);
}
}
}
package com.ssc24.chap25.demo01;
import static org.junit.Assert.*;
import org.junit.Test;
public class ChefTest {
@Test
public void test() {
System.out.println("===拜訪者模式測試===");
ChefGroup chefGroup = new ChefGroup();
chefGroup.join(new SuperChef("小當家"));
chefGroup.join(new DarkChef("紹安"));
chefGroup.join(new SuperNoodleChef("解師傅"));
System.out.println("第一回合:做燒賣");
Visitor round1 = new Visitor_saoMai();
chefGroup.topic(round1);
System.out.println("第二回合:豆腐");
Visitor round2 = new Visitor_tofu();
chefGroup.topic(round2);
}
} /** ===拜訪者模式測試=== 第一回合:做燒賣 小當家:宇宙大燒賣 紹安:魔幻鴉片燒賣 解師傅:鐵桿50人份燒賣 第二回合:豆腐 小當家:貓熊豆腐 紹安:豆腐三重奏 解師傅:鐵桿臭豆腐 **/