访问者模式
封装一些作用于某种数据结构中的各元素的操作,可以在不改变数据结构的前提下定义作用于这些元素的新的操作,其本质是预留通路,回调实现
数据与操作分离
核心概念
- Visitor 访问者接口
- ConcreteVisitor 访问者实现
- Element 抽象的元素对象
- ConcreteElement 具体的元素对象
- ObjectStructure 对象结构,包含多个被访问的对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| public abstract class Element {
public abstract void accept(Visitor visitor); }
public class ConcreteElementA extends Element{ @Override public void accept(Visitor visitor) { visitor.visitConcreteElementA(this);
}
public void operationA(){ System.out.println("A实现"); } }
public class ConcreteElementB extends Element{ @Override public void accept(Visitor visitor) { visitor.visitConcreteElementB(this);
}
public void operationB(){ System.out.println("B实现"); } }
public interface Visitor {
void visitConcreteElementA(ConcreteElementA element);
void visitConcreteElementB(ConcreteElementB element); }
public class ConcreteVisitorA implements Visitor{ @Override public void visitConcreteElementA(ConcreteElementA element) { element.operationA(); }
@Override public void visitConcreteElementB(ConcreteElementB element) { element.operationB(); } }
public class ObjectStructure {
private List<Element> list = new ArrayList<>();
public void handleRequest(Visitor visitor){ for(Element element : list){ element.accept(visitor); } }
public void addElement(Element ele){ list.add(ele); } }
|
优缺点
优点
缺点
使用场景
- 相对一个对象结构实施一些依赖于对象结构中具体类的操作
- 想对一个对象结构中的各个元素进行很多不同的而且不相关的操作,为了避免这些操作使类变得杂乱
- 对象结构很少变动,但是需要经常给对象结构中的元素对象定义新的操作