封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
以两个节点为例,visitor需要两个方法分别访问两个节点
public interface Visitor { public void visit(NodeA node); public void visit(NodeB node); }
具体的visitorA访问拿到具体的node对象
public class VisitorA implements Visitor{ @Override public void visit(NodeA node) { System.out.println("VisitorA访问:"+node.operationA()); } @Override public void visit(NodeB node) { System.out.println("VisitorA访问:"+node.operationB()); } }
node接口,接受visitor访问
public interface Node { public void accept(Visitor visitor); }
具体的节点nodeA,接受访问者访问并返回自身对象
public class NodeA implements Node { @Override public void accept(Visitor visitor) { visitor.visit(this); } public String operationA(){ return "NodeA"; } }
具体的节点nodeB,接受访问者返回自身对象
public class NodeB implements Node { @Override public void accept(Visitor visitor) { visitor.visit(this); } public String operationB(){ return "NodeB"; } }
拥有节点的聚集对象
public class ObjectStructure { private List<Node> nodes; public ObjectStructure() { this.nodes = new ArrayList<Node>(); } public void addNode(Node node){ this.nodes.add(node); } public void deleteNode(Node node){ this.nodes.remove(node); } public void action(Visitor visitor){ for (Node node : nodes) { node.accept(visitor); } } }
测试类
public class VisitorTest { public static void main(String[] args) { ObjectStructure objectStructure = new ObjectStructure(); objectStructure.addNode(new NodeA()); objectStructure.addNode(new NodeB()); //提供操作方法让visitor一一访问每个node objectStructure.action(new VisitorA()); } }
好的扩展性 能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。
好的复用性 可以通过访问者来定义整个对象结构通用的功能,从而提高复用程度。
分离无关行为 可以通过访问者来分离无关的行为,把相关的行为封装在一起,构成一个访问者,这样每一个访问者的功能都比较单一。
对象结构变化很困难 不适用于对象结构中的类经常变化的情况,因为对象结构发生了改变,访问者的接口和访问者的实现都要发生相应的改变,代价太高。
破坏封装 访问者模式通常需要对象结构开放内部数据给访问者和ObjectStructrue,这破坏了对象的封装性。
原文链接:https://blog.csdn.net/qq_30325833/article/details/90477669