第二节:访问者模式——访问者模式应用实例

一、访问者模式应用实例

  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 }

 

 

原文地址:https://www.cnblogs.com/niujifei/p/14395480.html