《JAVA与模式》第24天―访问者模式 (六)

2014-11-24 08:31:47 · 作者: · 浏览: 13
**
* NodeA特有的方法
*/
public String operationA() {
return "NodeA";
}

}

  具体节点类NodeB

[java]
package com.bankht.Visitor.visitor;

/**
* @author: 特种兵—AK47
* @创建时间:2012-7-3 上午10:59:59
*
* @类说明 :
*/
public class NodeB extends Node {
/**
* 接受方法
*/
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}

/**
* NodeB特有的方法
*/
public String operationB() {
return "NodeB";
}
}
package com.bankht.Visitor.visitor;

/**
* @author: 特种兵—AK47
* @创建时间:2012-7-3 上午10:59:59
*
* @类说明 :
*/
public class NodeB extends Node {
/**
* 接受方法
*/
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}

/**
* NodeB特有的方法
*/
public String operationB() {
return "NodeB";
}
}

  结构对象角色类,这个结构对象角色持有一个聚集,并向外界提供add()方法作为对聚集的管理操作。通过调用这个方法,可以动态地增加一个新的节点。

[java]
package com.bankht.Visitor.visitor;

import java.util.ArrayList;
import java.util.List;

/**
* @author: 特种兵—AK47
* @创建时间:2012-7-3 上午11:00:15
*
* @类说明 :
*/
public class ObjectStructure {

private List nodes = new ArrayList();

/**
* 执行方法操作
*/
public void action(Visitor visitor) {

for (Node node : nodes) {
node.accept(visitor);
}

}

/**
* 添加一个新元素
*/
public void add(Node node) {
nodes.add(node);
}
}
package com.bankht.Visitor.visitor;

import java.util.ArrayList;
import java.util.List;

/**
* @author: 特种兵—AK47
* @创建时间:2012-7-3 上午11:00:15
*
* @类说明 :
*/
public class ObjectStructure {

private List nodes = new ArrayList();

/**
* 执行方法操作
*/
public void action(Visitor visitor) {

for (Node node : nodes) {
node.accept(visitor);
}

}

/**
* 添加一个新元素
*/
public void add(Node node) {
nodes.add(node);
}
}

  客户端类

[java]
package com.bankht.Visitor.visitor;

/**
* @author: 特种兵—AK47
* @创建时间:2012-7-3 上午11:00:29
*
* @类说明 :
*/
public class Client {

public static void main(String[] args) {
// 创建一个结构对象
ObjectStructure os = new ObjectStructure();
// 给结构增加一个节点
os.add(new NodeA());
// 给结构增加一个节点
os.add(new NodeB());
// 创建一个访问者
Visitor visitor = new VisitorA();
os.action(visitor);
}

}
package com.bankht.Visitor.visitor;

/**
* @author: 特种兵—AK47
* @创建时间:2012-7-3 上午11:00:29
*
* @类说明 :
*/
public class Client {

public static void main(String[] args) {
// 创建一个结构对象
ObjectStructure os = new ObjectStructure();
// 给结构增加一个节点
os.add(new NodeA());
// 给结构增加一个节点
os.add(new NodeB());
// 创建一个访问者
Visitor visitor = new VisitorA();
os.action(visitor);
}

}

  虽然在这个示意性的实现里并没有出现一个复杂的具有多个树枝节点的对象树结构,但是,在实际系统中访问者模式通常是用来处理复杂的对象树结构的,而且访问者模式可以用来处理跨越多个等级结构的树结构问题。这正是访问者模式的功能强大之处。

  准备过程时序图
  首先,这个示意性的客户端创建了一个结构对象,然后将一个新的NodeA对象和一个新的NodeB对象传入。

  其次,客户端创建了一个VisitorA对象,并将此对象传给结构对象。

  然后,客户端调用结构对象聚集管理方法,将NodeA和NodeB节点加入到结构对象中去。

  最后,客户端调用结构对象的行动方法action(),启动访问过程。

\

  访问过程时序图
  \

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

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

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

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

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

访问者模式的优点
  ●  好的扩展性

  能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。

  ●  好的复用性

  可以通过访问者来定义整个对象结构通用的功能,从而提高复用程度。

  ●  分离无关行为

  可以通过访问者来分离无关的行为,把相关的行为封装在