一、背景
相信大家都吃过鱼,有的喜欢将其清蒸,有的喜欢将其煎炸,有的习惯将其炖煮。鱼不会应其烹饪方法而改变。同样在系统中如果要针对某一数据结构操作,如果数据结构因对其的操作而改变,想想都会觉得很麻烦,然而访问者模式正是应对这种场景。
二、概念
访问者模式:表示作用于某对象结构各元素的操作,它使你在不改变各元素类的前提下定义作用于这些元素的新操作。
三、代码实例
/**
* 被访问者接口
*/
interface Subject {
public void accept(Visitor visitor);
public Subject getSubject();
}
class MySubject implements Subject {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
@Override
public Subject getSubject() {
return this;
}
}
/**
* 访问者接口
*/
interface Visitor {
public void visit(Subject subject);
}
class MyVisitor implements Visitor {
@Override
public void visit(Subject subject) {
System.out.println(this + " 访问了--> " + subject.getSubject());
}
}
class HisVisitor implements Visitor {
@Override
public void visit(Subject subject) {
System.out.println(this + " 访问了--> " + subject.getSubject());
}
}
/**
* 访问者模式适用于数据接口不变
* 但是在其数据结构上的行为经常发生变化的情形 解决了数据结构与在其上操作的耦合问题
*/
public class VisitorPatternDemo {
public static void main(String[] args) {
Visitor myVisitor = new MyVisitor();
Subject subject = new MySubject();
subject.accept(myVisitor);
Visitor hisVisitor = new HisVisitor();
subject.accept(hisVisitor);
}
}