总结:
1.访问者模式包含两大类:对象 和 行为;对象和行为的名字看客们可以随便起。
2.对象必须稳定
3.行为可以多变;这就是访问者模式的优点,增加一个行为很容易,遵循对扩展开发,对修改关闭的原则
4.对象中抽象一个接受行为的方法,暂且叫做accept方法,参数为行为。accepte(Action action)
5.行为中抽象 N 个方法操作对象。N=对象的个数;这也正是为什么需要对象稳定的原因,对象不稳定,则行为中的方法就不固定了
6.对象的抽象方法参数为行为,可以控制过滤行为,可以调用行为定义的方法
7.行为的抽象方法参数为具体的对象,可以针对具体的对象执行具体的业务逻辑
建模图:
Element就是对象,visitor就是行为;
暂且定义对象为People 行为对象为Action
对象的接口定义
interface People{ void accept(Action action) ;}
对象的具体实现类 男人 女人
class Man implements People{ void accept(Action action){action.do(this)}}
class Woman implements People{void accept(Action action){action.do(this)}}
行为的接口定义
interface Action{ void do(Man man); void do(Woman woman);} 也可以变种为 void do(People p);
行为的具体实现类 吃的操作
class Eat implements Action{ void do(Man man){System.out.pring("man eat meat")} void do(Woman){System.out.pring("Woman eat except meat")}}
还有很多,可以自行添加
class ..... implements Action{.....}
将对象和行为结合在一起,集中管理。增加添加和删除对象的方法,遍历对象传入行为,得到所有对象对于行为的处理方式
class Manage{ List<People> peoples ;
void attach(People p){people.add(p)}
void detach(People){people.remove(p)}
void show(Action action){for(People p:peoples){p.accept(action)}}
}
上述中,对于增加行为而言,只需要继承行为接口Action,实现两个具体的方法即可。其它代码逻辑不用动。
比如 新增行为 Sleep
class Sleep implements Action{ void do(Man man){.....} void do(Woman woman) {.....}}
new Manage().show(Sleep) 即可出现对象对于睡觉Sleep的行为的处理方式;
读者如果还不懂,推荐一个针对访问者写的不错的链接https://blog.csdn.net/chenssy/article/details/12029633