访问者模式:
表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
// 人的抽象类
public abstract class Person {
// 接受一个'访问者'为参数
public abstract void accept(Action visitor);
}
// 男人
public class Man extends Person {
@Override
public void accept(Action visitor) {
visitor.getManReflection(this);
}
}
// 女人
public class Woman extends Person {
@Override
public void accept(Action visitor) {
visitor.getWomanReaction(this);
}
}
// 状态的抽象类
public abstract class Action {
// 获取男人的反应
public abstract void getManReflection(Man m);
// 获取女人的反应
public abstract void getWomanReaction(Woman w);
}
// 成功
public class Success extends Action {
@Override
public void getManReflection(Man m) {
System.out.println("When a man successed , there will be a great women behind him! ");
}
@Override
public void getWomanReaction(Woman w) {
System.out.println("When a woman successed , there will be a bad man behind him! ");
}
}
// 失败
public class Fail extends Action {
@Override
public void getManReflection(Man m) {
System.out.println("When a man failed , they will be driken ");
}
@Override
public void getWomanReaction(Woman w) {
System.out.println("When a woman failed , they will crying! ");
}
}
public class ObjectStructure {
private List<Person> elements = new ArrayList<Person>();
// 移除
public void detach(Person p) {
elements.remove(p);
}
// 增加
public void attach(Person p) {
elements.add(p);
}
// 显示
public void display(Action visitor) {
for (Person p : elements) {
p.accept(visitor);
}
}
}
// 客户端
public class VisitorMain {
public static void main(String[] args) {
ObjectStructure os = new ObjectStructure();
Person man = new Man();
Person woman = new Woman();
os.attach(man);
os.attach(woman);
Success v = new Success();
os.display(v);
Fail f = new Fail();
os.display(f);
}
}
访问者模式的优点:
增加新的操作很容易,因为增加一个新的操作意味着增加一个新的访问者,但如果数据结构对象易于变化,经常有新的数据对象增加进来,就不适合使用访问者模式。