1 定义
表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。
2 适用场景
适用于数据结构相对稳定,又有易于变化的算法的系统(就是element稳定,visitor经常变化)
3 优势
由于把数据结构和数据结构上的操作进行了解耦,也就是把处理从数据结构中分离出来,使得增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。
4 缺点
源于优点,使得增加数据结构变得困难了。
5 定性
因为数据结构不变化的情况比较难找,所以大多数时候并不需要访问者模式,但是一旦需要访问者模式,那就是真的用它了。
6 UML
7 例子
7.1 UML
7.2 代码
Main
public class Main {
public static void main(String[] args) {
ObjectStructure o=new ObjectStructure();
o.attach(new Man());
o.attach(new Woman());
//成功时的反应
Success success=new Success();
o.display(success);
//失败时的反应
Fail fail=new Fail();
o.display(fail);
}
}
Action
//相当于visitor访问者
public abstract class Action {
public abstract void getManConclusion(Man concreteElement);
public abstract void getWomanConclusion(Woman concreteElement);
}
Success
public class Success extends Action {
@Override
public void getManConclusion(Man concreteElement) {
String personType=concreteElement.getClass().getName();
String visitorType=this.getClass().getName();
System.out.println(String.format("%s %s 时,背后有个成功的女人",personType.substring(personType.lastIndexOf(".")+1),visitorType.substring(visitorType.lastIndexOf(".")+1)));
}
@Override
public void getWomanConclusion(Woman concreteElement) {
String personType=concreteElement.getClass().getName();
String visitorType=this.getClass().getName();
System.out.println(String.format("%s %s 时,背后有个不成功的男人",personType.substring(personType.lastIndexOf(".")+1),visitorType.substring(visitorType.lastIndexOf(".")+1)));
}
}
Fail
public class Fail extends Action {
@Override
public void getManConclusion(Man concreteElement) {
String personType=concreteElement.getClass().getName();
String visitorType=this.getClass().getName();
System.out.println(String.format("%s %s 时,门头喝闷酒,谁也劝不动",personType.substring(personType.lastIndexOf(".")+1),visitorType.substring(visitorType.lastIndexOf(".")+1)));
}
@Override
public void getWomanConclusion(Woman concreteElement) {
String personType=concreteElement.getClass().getName();
String visitorType=this.getClass().getName();
System.out.println(String.format("%s %s 时,眼泪汪汪,谁也劝不了",personType.substring(personType.lastIndexOf(".")+1),visitorType.substring(visitorType.lastIndexOf(".")+1)));
}
}
Person
//相当于element
public abstract class Person {
public abstract void accept(Action visitor);
}
Man
public class Man extends Person {
@Override
public void accept(Action visitor) {
visitor.getManConclusion(this);
}
}
Woman
public class Woman extends Person {
@Override
public void accept(Action visitor) {
visitor.getWomanConclusion(this);
}
}
ObjectStructure
//对象结构
public class ObjectStructure {
private ArrayList<Person> elements = new ArrayList<>();
public void attach(Person element) {
elements.add(element);
}
public void detach(Person element) {
elements.remove(element);
}
public void display(Action visitor) {
for (Person person : elements) {
person.accept(visitor);
}
}
}
参考
https://blog.csdn.net/caoxiaohong1005/article/details/79575728