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人份燒賣 第二回合:豆腐 小當家:貓熊豆腐 紹安:豆腐三重奏 解師傅:鐵桿臭豆腐 **/