Java访问者模式

java

    

  

结构对象会遍历它自己所保存的聚集中的所有节点,在本系统中就是节点NodeA和NodeB。首先NodeA会被访问到,这个访问是由以下的操作组成的:

  (1)NodeA对象的接受方法accept()被调用,并将VisitorA对象本身传入;

  (2)NodeA对象反过来调用VisitorA对象的访问方法,并将NodeA对象本身传入;

  (3)VisitorA对象调用NodeA对象的特有方法operationA()。

  从而就完成了双重分派过程,接着,NodeB会被访问,这个访问的过程和NodeA被访问的过程是一样的,这里不再叙述。

适用于 数据结构稳定,再增加就比较困难

  

/**

* Created by nicknailo on 2018/9/1.

*/

public class VisitorDesign {

public static void main(String[] args) {

//创建一个结构对象

ObjectStructure os = new ObjectStructure();

//给结构增加一个节点

os.add(new NodeA());

//给结构增加一个节点

os.add(new NodeB());

//创建一个访问者

Visitor visitor = new VisitorB();

os.action(visitor);

}

}

interface Visitor {

/** 对应于NodeA的访问操作 */

public void visit(NodeA node);

/** 对应于NodeB的访问操作 */

public void visit(NodeB node);

}

class VisitorA implements Visitor {

/** 对应于NodeA的访问操作 */

@Override

public void visit(NodeA node) {

System.out.println(node.operationA());

}

/** 对应于NodeB的访问操作 */

@Override

public void visit(NodeB node) {

System.out.println(node.operationB());

}

}

class VisitorB implements Visitor {

/** 对应于NodeA的访问操作 */

@Override

public void visit(NodeA node) {

System.out.println(node.operationA());

}

/** 对应于NodeB的访问操作 */

@Override

public void visit(NodeB node) {

System.out.println(node.operationB());

}

}

interface Node {

/** 接受操作 */

public abstract void accept(Visitor visitor);

}

class NodeA implements Node{

/** 接受操作 */

@Override

public void accept(Visitor visitor) {

visitor.visit(this);

}

/** NodeA特有的方法 */

public String operationA(){

return "NodeA";

}

}

class NodeB implements Node{

/** 接受方法 */

@Override

public void accept(Visitor visitor) {

visitor.visit(this);

}

/** NodeB特有的方法 */

public String operationB(){

return "NodeB";

}

}

class ObjectStructure {

private List<Node> nodes = new ArrayList<Node>();

/** 执行方法操作 */

public void action(Visitor visitor) {

for(Node node : nodes) {

node.accept(visitor);

}

}

/** 添加一个新元素 */

public void add(Node node){

nodes.add(node);

}

}

运行后

NodeA

NodeB

以上是 Java访问者模式 的全部内容, 来源链接: utcz.com/z/394472.html

回到顶部