访问者模式涉及的角色如下:
1 抽象访问者(Visitor)角色:声明了一个或多个方法操作,形成所有具体访问者角色必须实现的接口。
2 具体访问者(ConcreteVisitor)角色:实现抽象访问在所声明的接口,也就是抽象访问者所声明的各个访问操作。
3 抽象节点(Node)角色:声明一个接受操作,接受一个访问者对象所为一个参数
4 具体节点(ConcreteNode)角色:实现了抽象节点所规定的接受操作。
5 结构对象(ObjectStructure)角色:有如下的责任,可以遍历结构中的所有元素;如果需要,
提供一个高层次接口让访问者对象可以访问每一个元素,可以设计成一个复合对象或一个聚集,List或set
Visitor:抽象层
public interface Visitor {
/**
* 对应于NodeA的访问操作
*/
public void visit(NodeA node);
/**
* 对应于NodeB的访问操作
*/
public void visit(NodeB node);
}
具体访问者:
public 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());
}
}
public 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());
}
}
抽象节点类:
public abstract class Node {
/**
* 接受操作
*/
public abstract void accept(Visitor visitor);
}
具体节点:
public class NodeA extends Node{
/**
* 接受操作
*/
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
/**
* NodeA特有的方法
*/
public String operationA(){
return "NodeA";
}
}
public class NodeB extends Node{
/**
* 接受方法
*/
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
/**
* NodeB特有的方法
*/
public String operationB(){
return "NodeB";
}
}
结构对象角色类:这个结构对象角色持有一个聚集,并向外界提供add()方法作为对聚集的管理操作。通过调用这个方法,可以动态地增加一个新的节点。
public 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);
}
}
客户端
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);
}
}
1 抽象访问者(Visitor)角色:声明了一个或多个方法操作,形成所有具体访问者角色必须实现的接口。
2 具体访问者(ConcreteVisitor)角色:实现抽象访问在所声明的接口,也就是抽象访问者所声明的各个访问操作。
3 抽象节点(Node)角色:声明一个接受操作,接受一个访问者对象所为一个参数
4 具体节点(ConcreteNode)角色:实现了抽象节点所规定的接受操作。
5 结构对象(ObjectStructure)角色:有如下的责任,可以遍历结构中的所有元素;如果需要,
提供一个高层次接口让访问者对象可以访问每一个元素,可以设计成一个复合对象或一个聚集,List或set
Visitor:抽象层
public interface Visitor {
/**
* 对应于NodeA的访问操作
*/
public void visit(NodeA node);
/**
* 对应于NodeB的访问操作
*/
public void visit(NodeB node);
}
具体访问者:
public 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());
}
}
public 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());
}
}
抽象节点类:
public abstract class Node {
/**
* 接受操作
*/
public abstract void accept(Visitor visitor);
}
具体节点:
public class NodeA extends Node{
/**
* 接受操作
*/
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
/**
* NodeA特有的方法
*/
public String operationA(){
return "NodeA";
}
}
public class NodeB extends Node{
/**
* 接受方法
*/
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
/**
* NodeB特有的方法
*/
public String operationB(){
return "NodeB";
}
}
结构对象角色类:这个结构对象角色持有一个聚集,并向外界提供add()方法作为对聚集的管理操作。通过调用这个方法,可以动态地增加一个新的节点。
public 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);
}
}
客户端
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);
}
}