访问者模式(Visitor)
表示一个作用于某对象结构中的个元素的操作,它可以使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
最简单的编程实现
简单的面向对象编程
这种方法,如果我在加一个结婚的状态,还要修改源码。
Element类:
public abstract class Person {
protected String gender;
public abstract void accept(State state);
}
ConcreteElementA:(男人)
public class Man extends Person {
@Override
public void accept(State state) {
super.gender = "男人";
state.getConclusion(this);
}
}
ConcreteElementA:(女人)
public class Woman extends Person {
@Override
public void accept(State state) {
super.gender="女人";
state.getConclusion(this);
}
}
Visitor;
public abstract class State {
protected String state;
public abstract void getConclusion(Man man);
public abstract void getConclusion(Woman woman);
}
ConcreteVisitorA:
public class Succeed extends State {
@Override
public void getConclusion(Man man) {
System.out.println(man.gender+state+"时,背后多半有一个伟大的女人");
}
@Override
public void getConclusion(Woman woman) {
System.out.println(woman.gender+state+"时,背后大多有一个不成功的男人");
}
}
ConcreteVisitorA:
public class Failed extends State {
@Override
public void getConclusion(Man man) {
System.out.println(man.gender+state+"时,闷头喝酒,谁也不用劝");
}
@Override
public void getConclusion(Woman woman) {
System.out.println(woman.gender+state+"时,眼泪汪汪,谁也劝不了");
}
}
ObjectStructure:
public class ObjectStructure {
private List<Person> persons = new ArrayList<>();
public void addPerson(Person person){
persons.add(person);
}
public void removePerson(Person person){
persons.remove(person);
}
public void display(State state){
for (Person person : persons) {
person.accept(state);
}
}
}
public class Test {
public static void main(String[] args) {
//男人
Person man = new Man();
//女人
Person woman = new Woman();
ObjectStructure objects = new ObjectStructure();
objects.addPerson(man);
objects.addPerson(woman);
//成功状态
Succeed succeed = new Succeed();
succeed.state = "成功";
objects.display(succeed);
//失败状态
Failed failed = new Failed();
failed.state = "失败";
objects.display(failed);
}
}
男人成功时,背后多半有一个伟大的女人
女人成功时,背后大多有一个不成功的男人
男人失败时,闷头喝酒,谁也不用劝
女人失败时,眼泪汪汪,谁也劝不了
如果我要增加一个结婚的状态,我只需要加个结婚的访问者就可以。它把数据结构和操作分离。
访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开使得操作集合可以相对自由的演化。
访问者模式的目的是要把处理从数据结构分离出来。如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。因为访问者模式使得算法操作的增加变得容易。反之,就不适合。
访问者模式的优点就是增加 新的操作是非常容易的,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
但是访问者的确定点就是使增加新的数据结构变得困难了。