一:背景
在大话设计模式一书中提到一种场景,男人和女人在面对不同的事情时会有不同的反应,例如成功、失败、结婚、恋爱等等,在这种结构相对稳定(只有男人和女人),而遇到的情况多变的情形下,我们就可以用访问者模式来实现,还是先看下面的介绍吧。
二:概述
1、定义
表示一个作用于某对象结构中的各元素的操作。它可以使你在不改变各元素的类的前提下定义作用于这些元素的新操作。
2、类图结构
- visitor:表示作用于元素的操作
- element:要作用的元素
- ObjectStructure:用于提供高层的接口来允许访问者访问各个元素
三:实例分析
就拿男人和女人在对待不同事情状况时的表现来说明
让我们来看更加直观的代码表示
Action(状态):
public abstract class Action {
//得到男人反应
public abstract void getManConclusion(Man concreteElementA);
//得到女人反应
public abstract void getWomanConclusion(Woman concreteElementB);
}
具体状态
public class Success extends Action {
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getTypeName()+this.getClass().getTypeName()+"哈哈哈");
}
@Override
public void getWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getTypeName()+this.getClass().getTypeName()+"嘤嘤嘤");
}
}
public class Failing extends Action {
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getTypeName()+this.getClass().getTypeName()+"喝喝喝");
}
@Override
public void getWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getTypeName()+this.getClass().getTypeName()+"呜呜呜");
}
}
结构对象person:
public abstract class Person {
//接受
public abstract void accept(Action visitor);
}
男人和女人:
public class Man extends Person {
@Override
public void accept(Action visitor) {
visitor.getManConclusion(this);
}
}
public class Woman extends Person {
@Override
public void accept(Action visitor) {
visitor.getWomanConclusion(this);
}
}
对象结构(用于提供访问者接口):
public class ObjectStructure {
private List<Person> elements = new ArrayList<Person>();
public void attach(Person p){
elements.add(p);
}
public void detach(Person p){
elements.remove(p);
}
//查看显示
public void display(Action action){
for (Person element: elements
) {
element.accept(action);
}
}
}
来看客户端如何调用:
ObjectStructure o = new ObjectStructure();
o.attach(new Man());
o.attach(new Woman());
//成功
Success v1 = new Success();
o.display(v1);
//失败
Failing v2 = new Failing();
o.display(v2);
结果为:
visitor.Manvisitor.Success哈哈哈
visitor.Womanvisitor.Success嘤嘤嘤
visitor.Manvisitor.Failing喝喝喝
visitor.Womanvisitor.Failing呜呜呜
访问者模式适用于数据结构相对稳定的系统,它将数据结构与作用于结构上的操作进行解耦,使操作集合可以相对自由的变化;它的优点就是使得增加新的操作很容易,缺点就是增加新的数据结构很困难,因为数据结构的变化会使得整个操作的集合也得进行调整,像我们例子中,人分为男人女人,这就是属于数据结构相对稳定的一种,适合用访问者模式来实现。
参考书籍:《大话设计模式》