20 行为模式 - 访问者(Visitor)模式

1.用意

封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

 

2.类图


 

3.代码

/*
 * 模式中的抽象节点
 */
public abstract class Node {
	public abstract void accept(Visitor visitor);
}


/*
 * 具体Node角色A
 */
public class NodeA extends Node {
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}

	public String operationA() {
		return "Node A is visited";
	}
}


/*
 * 具体Node角色B
 */
public class NodeB extends Node {
	public void accept(Visitor visitor) {
		visitor.visit(this);
	}

	public String operationB() {
		return "Node B is visited";
	}
}


/*
 * 抽象访问者
 */
public interface Visitor {
	void visit(NodeA node);

	void visit(NodeB node);
}


/*
 * 具体访问者A
 */
public class VisitorA implements Visitor {
	public void visit(NodeA nodeA) {
		S.s(nodeA.operationA());
	}

	public void visit(NodeB nodeB) {
		S.s(nodeB.operationB());
	}
}


/*
 * 具体访问者B
 */
public class VisitorB implements Visitor {
	public void visit(NodeA nodeA) {
		S.s(nodeA.operationA());
	}

	public void visit(NodeB nodeB) {
		S.s(nodeB.operationB());
	}
}


/*
 * 结构对象
 */
public class ObjectStructure {
	private Vector nodes;
	private Node node;

	public ObjectStructure() {
		nodes = new Vector();
	}

	/*
	 * 执行访问操作
	 */
	public void action(Visitor visitor) {
		for(Enumeration e = nodes.elements();e.hasMoreElements();){
			node = (Node)e.nextElement();
			node.accept(visitor);
		}
	}

	public void add(Node node) {
		nodes.addElement(node);
	}
}


/*
 * 测试类
 */
public class Test {
	private static ObjectStructure aObjects;
	private static Visitor visitor;

	public static void main(String[] args) {
		aObjects = new ObjectStructure();
		aObjects.add(new NodeA());
		aObjects.add(new NodeB());
		visitor = new VisitorA();
		aObjects.action(visitor);
	}
}
 总结:结构对象中的Node对象的操作在visitor中控制,可以修改操作,但数据结构不用改。

 

 

z

上一篇: 19 行为模式 - 状态(State)模式
下一篇: 21 行为模式 - 解释器(Interpreter)模式
O2AtomLife
博客等级 码龄19年 2粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值