一、访问者模式应用实例
1、应用实例要求
将人分为男人和女人,对歌手进行测评,当看完某个歌手表演后,得到他们对该歌手不同的评价(评价有不同种类:比如成功、失败),使用访问者模式完成实现。
2、思路分析和图解
二、代码实现
抽象访问者:
1 /** 2 * 访问者 3 */ 4 public abstract class Action { 5 6 /** 7 * 得到男性的测评 8 */ 9 public abstract void getManResult(Man man); 10 11 /** 12 * 得到女性的评测 13 */ 14 public abstract void getWomanResult(Woman woman); 15 }
具体访问者:
1 public class Success extends Action{ 2 @Override 3 public void getManResult(Man man) { 4 System.out.println("男人给的评价是该歌手很成功"); 5 } 6 7 @Override 8 public void getWomanResult(Woman woman) { 9 System.out.println("女人给的评价是该歌手很成功"); 10 } 11 } 12 ------------------------------------------------------ 13 public class Fail extends Action{ 14 @Override 15 public void getManResult(Man man) { 16 System.out.println("男人给的评价是该歌手失败"); 17 } 18 19 @Override 20 public void getWomanResult(Woman woman) { 21 System.out.println("女人给的评价是该歌手失败"); 22 } 23 }
Element 抽象类:
1 public abstract class Person { 2 3 /** 4 * 提供一个方法,让访问者可以访问 5 */ 6 public abstract void accept(Action action); 7 }
ConcreteElement 具体实现类:
1 /** 2 * 说明: 3 * 1、这里我们使用到了双分派,即首先在客户端程序中将具体的状态作为参数 4 * 传递到了 Man 中(第一次分派), 5 * 6 * 2、然后 Man 类中调用作为参数的 "具体方法" 中方法getManResult, 7 * 同时将自己(this)作为参数传入(第二次分派) 8 */ 9 public class Man extends Person{ 10 @Override 11 public void accept(Action action) { 12 action.getManResult(this); 13 } 14 } 15 16 --------------------------------------------------- 17 public class Woman extends Person{ 18 @Override 19 public void accept(Action action) { 20 action.getWomanResult(this); 21 } 22 }
ObjectStructure 数据结构:
1 /** 2 * 数据结构,管理很多人(Man,Woman,,,) 3 */ 4 public class ObjectStructure { 5 6 /** 7 * 维护了一个集合 8 */ 9 public List<Person> persons = new LinkedList<>(); 10 11 /** 12 * 增加到 list 13 */ 14 public void attache(Person person) { 15 persons.add(person); 16 } 17 18 /** 19 * 移除 20 */ 21 public void detach(Person person) { 22 persons.remove(person); 23 } 24 25 /** 26 * 提示测评情况 27 */ 28 public void display(Action action) { 29 for (Person p : persons) { 30 p.accept(action); 31 } 32 } 33 }
客户端:
1 public class Client { 2 public static void main(String[] args) { 3 //创建 ObjectStructure 4 ObjectStructure objectStructure = new ObjectStructure(); 5 6 objectStructure.attache(new Man()); 7 objectStructure.attache(new Woman()); 8 9 //成功 10 Success success = new Success(); 11 objectStructure.display(success); 12 13 Fail fail = new Fail(); 14 objectStructure.display(fail); 15 16 int size = objectStructure.persons.size(); 17 for (int i = 0; i < size; i++) { 18 if (i % 2 == 0) { 19 objectStructure.persons.get(i).accept(success); 20 } else { 21 objectStructure.persons.get(i).accept(fail); 22 } 23 } 24 } 25 }