package visitor.俠客行; public interface 掌門人 { }
package visitor.俠客行; public class 沒作過壞事的掌門 implements 掌門人 { }
package visitor.俠客行; public class 作過壞事的掌門 implements 掌門人 { }
package visitor.俠客行; import java.util.ArrayList; import java.util.List; public class 俠客島 { private List<掌門人> 掌門人List = new ArrayList<>(); public void add掌門人(掌門人 某掌門) { 掌門人List.add(某掌門); } public void 賞善罰惡(String 處理人) { if (處理人.equals("張三")) { for (掌門人 某掌門X : 掌門人List) { if (某掌門X instanceof 沒作過壞事的掌門) { System.out.println("好掌門, 張三: 賞賜沒作過壞事的掌門"); } else if (某掌門X instanceof 作過壞事的掌門) { System.out.println("壞掌門, 張三: 無論作過壞事的掌門"); } System.out.println(); } } else if (處理人.equals("李四")) { for (掌門人 某掌門X : 掌門人List) { if (某掌門X instanceof 沒作過壞事的掌門) { System.out.println("好掌門, 李四: 無論沒作過壞事的掌門"); } else if (某掌門X instanceof 作過壞事的掌門) { System.out.println("壞掌門, 李四: 懲罰作過壞事的掌門"); } System.out.println(); } } } }
package visitor.新版俠客行; public interface 掌門人 { } package visitor.新版俠客行; public class 沒作過壞事的掌門 implements 掌門人 { } package visitor.新版俠客行; public class 作過壞事的掌門 implements 掌門人 { }
package visitor.新版俠客行; public interface 訪問使者 { void 拜訪(作過壞事的掌門 壞人); void 拜訪(沒作過壞事的掌門 好人); }
package visitor.新版俠客行; public class 張三 implements 訪問使者 { @Override public void 拜訪(沒作過壞事的掌門 好人) { System.out.println("好掌門, 張三: 賞賜沒作過壞事的掌門"); } @Override public void 拜訪(作過壞事的掌門 壞人) { System.out.println("壞掌門, 張三: 無論作過壞事的掌門"); } }
package visitor.新版俠客行; public class 李四 implements 訪問使者 { @Override public void 拜訪(沒作過壞事的掌門 好人) { System.out.println("好掌門, 李四: 無論沒作過壞事的掌門"); } @Override public void 拜訪(作過壞事的掌門 壞人) { System.out.println("壞掌門, 李四: 懲罰作過壞事的掌門"); } }
package visitor.新版俠客行; import java.util.ArrayList; import java.util.List; public class 俠客島 { private List<掌門人> 掌門人List = new ArrayList<>(); public void add掌門人(掌門人 某掌門) { 掌門人List.add(某掌門); } public void 賞善罰惡(訪問使者 使者) { for (掌門人 某掌門X : 掌門人List) { if (某掌門X instanceof 沒作過壞事的掌門) { 使者.拜訪((沒作過壞事的掌門)某掌門X); } else if (某掌門X instanceof 作過壞事的掌門) { 使者.拜訪((作過壞事的掌門)某掌門X); } System.out.println(); } } }
package visitor.新版俠客行; public class Test { public static void main(String[] args){ 俠客島 善善罰惡二使 = new 俠客島(); 善善罰惡二使.add掌門人(new 作過壞事的掌門()); 善善罰惡二使.add掌門人(new 沒作過壞事的掌門()); 善善罰惡二使.add掌門人(new 沒作過壞事的掌門()); 善善罰惡二使.add掌門人(new 作過壞事的掌門()); 訪問使者 張三 = new 張三(); 訪問使者 李四 = new 李四(); 善善罰惡二使.賞善罰惡(李四); 善善罰惡二使.賞善罰惡(張三); } }
package visitor.新版俠客行; public class 龍木島主 implements 訪問使者 { @Override public void 拜訪(作過壞事的掌門 壞人) { System.out.println("龍木島主,懲罰壞人"); } @Override public void 拜訪(沒作過壞事的掌門 好人) { System.out.println("龍木島主,賞賜好人"); } }
package visitor.最新版本俠客行; public interface 掌門人 { void 接受拜訪(訪問使者 賞善使者); }
package visitor.最新版本俠客行; public class 沒作過壞事的掌門 implements 掌門人 { @Override public void 接受拜訪(訪問使者 賞善罰惡使者) { 賞善罰惡使者.拜訪(this); } }
package visitor.最新版本俠客行; public class 作過壞事的掌門 implements 掌門人 { @Override public void 接受拜訪(訪問使者 賞善罰惡使者) { 賞善罰惡使者.拜訪(this); } }
package visitor.最新版本俠客行; public interface 訪問使者 { void 拜訪(作過壞事的掌門 壞人); void 拜訪(沒作過壞事的掌門 好人); } package visitor.最新版本俠客行; public class 張三 implements 訪問使者 { @Override public void 拜訪(沒作過壞事的掌門 好人) { System.out.println("好掌門, 張三: 賞賜沒作過壞事的掌門"); } @Override public void 拜訪(作過壞事的掌門 壞人) { System.out.println("壞掌門, 張三: 無論作過壞事的掌門"); } }
package visitor.最新版本俠客行; public class 李四 implements 訪問使者 { @Override public void 拜訪(沒作過壞事的掌門 好人) { System.out.println("好掌門, 李四: 無論沒作過壞事的掌門"); } @Override public void 拜訪(作過壞事的掌門 壞人) { System.out.println("壞掌門, 李四: 懲罰作過壞事的掌門"); } }
package visitor.最新版本俠客行; import java.util.ArrayList; import java.util.List; public class 俠客島 { private List<掌門人> 掌門人List = new ArrayList<>(); public void add掌門人(掌門人 某掌門) { 掌門人List.add(某掌門); } public void 賞善罰惡(訪問使者 使者) { for (掌門人 某掌門X : 掌門人List) { 某掌門X.接受拜訪(使者); System.out.println(); } } }
package visitor.最新版本俠客行; public class 龍木島主 implements 訪問使者 { @Override public void 拜訪(作過壞事的掌門 壞人) { System.out.println("龍木島主,懲罰壞人"); } @Override public void 拜訪(沒作過壞事的掌門 好人) { System.out.println("龍木島主,賞賜好人"); } }
package visitor.最新版本俠客行; public class 很差不壞的掌門 implements 掌門人 { @Override public void 接受拜訪(訪問使者 賞善罰惡使者) { 賞善罰惡使者.拜訪(this); } }
package visitor; public class example { public static void main(String[] args) { A1 a1 = new A1(); A2 a2 = new A2(); A3 a3 = new A3(); B1 b1 = new B1(); B2 b2 = new B2(); B3 b3 = new B3(); b1.accept(a1); b1.accept(a2); b1.accept(a3); b2.accept(a1); b2.accept(a2); b2.accept(a3); b3.accept(a1); b3.accept(a2); b3.accept(a3); } } abstract class A { abstract void visit(B1 b1); abstract void visit(B2 b2); abstract void visit(B3 b3); } class A1 extends A { @Override void visit(B1 b1) { System.out.println("A1 play with B1"); } @Override void visit(B2 b2) { System.out.println("A1 play with B2"); } @Override void visit(B3 b3) { System.out.println("A1 play with B3"); } } class A2 extends A { @Override void visit(B1 b1) { System.out.println("A2 play with B1"); } @Override void visit(B2 b2) { System.out.println("A2 play with B2"); } @Override void visit(B3 b3) { System.out.println("A2 play with B3"); } } class A3 extends A { @Override void visit(B1 b1) { System.out.println("A3 play with B1"); } @Override void visit(B2 b2) { System.out.println("A3 play with B2"); } @Override void visit(B3 b3) { System.out.println("A3 play with B3"); } } abstract class B { abstract void accept(A a); } class B1 extends B { @Override void accept(A a) { a.visit(this); } } class B2 extends B { @Override void accept(A a) { a.visit(this); } } class B3 extends B { @Override void accept(A a) { a.visit(this); } }