一,定义
访问者模式:表示一个作用于某对象结构中各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式适用于数据结构相对稳定的系统,他把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
二,示例
我们要实现一个男女在不同情况下的对比展示情况。因为只有男女,所以结构相对稳定
//人 抽象类 接受一个行为
public abstract class Person {
public abstract void accept(Action action);
}
//行为抽象类 获取男女不同的表现
public abstract class Action {
public abstract void getManConclusion(Man man);
public abstract void getWomanConclusion(Woman man);
}
public class Man extends Person {
public String name = "男人";
@Override
public void accept(Action action) {
action.getManConclusion(this);
}
}
public class Woman extends Person {
public String name = "女人";
@Override
public void accept(Action action) {
action.getWomanConclusion(this);
}
}
public class Success extends Action {
private String typeName = "成功";
@Override
public void getManConclusion(Man man) {
System.out.println(man.name+typeName+"时,"+"背后多半有一个伟大的女人!");
}
@Override
public void getWomanConclusion(Woman man) {
System.out.println(man.name+typeName+"时,"+"背后多半有一个不成功的男人!");
}
}
public class Failing extends Action {
private String typeName = "失败";
@Override
public void getManConclusion(Man man) {
System.out.println(man.name+typeName+"时,"+"闷头喝酒,谁也不用劝!");
}
@Override
public void getWomanConclusion(Woman man) {
System.out.println(man.name+typeName+"时,"+"眼泪汪汪,谁劝也没用!");
}
}
/**
* @类描述:对象结构
*/
public class ObjectStructure {
private List<Person> persons = new ArrayList<>();
public void attach(Person person) {
persons.add(person);
}
public void detach(Person person) {
persons.remove(person);
}
public void display(Action action) {
for (Person person : persons) {
person.accept(action);
}
}
}
//test main
//访问者模式
public static void visitorModel(){
ObjectStructure structure = new ObjectStructure();
structure.attach(new Man());
structure.attach(new Woman());
Success success = new Success();
structure.display(success);
Failing failing = new Failing();
structure.display(failing);
Amativeness amativeness = new Amativeness();
structure.display(amativeness);
}
输出结果:
男人成功时,背后多半有一个伟大的女人!
女人成功时,背后多半有一个不成功的男人!
男人失败时,闷头喝酒,谁也不用劝!
女人失败时,眼泪汪汪,谁劝也没用!
男人恋爱时,凡事不懂也要装懂!
女人恋爱时,遇事懂也装不懂!
三,总结
优点:
- 增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者,访问者模式将有关行为集中到一个访问对象中
缺点:
- 使增加新的数据结构变得很困难
应用场景:
- 访问者模式适用于数据结构相对稳定的系统,他把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
- 系统有比较稳定的数据结构,又有易于变化的算法,可以考虑用访问者模式将数据结构和算法分开。
访问者模式的目的是要把处理从数据结构中分离出来。
参考:《大话设计模式》