说明:
访问者模式可用于设计一个集合操作,该操作跨越由包含在同一类层次结构当中的一类对象组成的一个对象集。访问者模式允许在不改变对象集所属类的前提下定义操作。
设计思想:
对象集中的对象所属的类需要定义一个方法。
对执行访问者操作感兴趣的客户需要做到:
a,创建一个被设计用来执行所需操作的VisitorInteface接口的实现者(访问者)类的实例。
b,创建对象集,以上面创建的访问者实例作为参数调用其中每个成员对象的accept(visitor)方法。
实例:
它定义一些用于由不同类型的Order对象组成的对象集的操作。订单有以下三种类型:海外订单,加州订单,非加州订单
代码:
public interface Order {
public void accept(OrderVisitor v);
}
public class OverseasOrder implements Order {
private double orderAmount;
private double additionalSH;
public OverseasOrder() {
}
public OverseasOrder(double inp_orderAmount,
double inp_additionalSH) {
orderAmount = inp_orderAmount;
additionalSH = inp_additionalSH;
}
public double getOrderAmount() {
return orderAmount;
}
public double getAdditionalSH() {
return additionalSH;
}
public void accept(OrderVisitor v) {
v.visit(this);
}
}
public class CaliforniaOrder implements Order {
private double orderAmount;
private double additionalTax;
public CaliforniaOrder() {
}
public CaliforniaOrder(double inp_orderAmount,
double inp_additionalTax) {
orderAmount = inp_orderAmount;
additionalTax = inp_additionalTax;
}
public double getOrderAmount() {
return orderAmount;
}
public double getAdditionalTax() {
return additionalTax;
}
public void accept(OrderVisitor v) {
v.visit(this);
}
}
public class NonCaliforniaOrder implements Order {
private double orderAmount;
public NonCaliforniaOrder() {
}
public NonCaliforniaOrder(double inp_orderAmount) {
orderAmount = inp_orderAmount;
}
public double getOrderAmount() {
return orderAmount;
}
public void accept(OrderVisitor v) {
v.visit(this);
}
}
public interface VisitorInterface {
public void visit(NonCaliforniaOrder nco);
public void visit(CaliforniaOrder co);
public void visit(OverseasOrder oo);
}
import java.util.*;
class OrderVisitor implements VisitorInterface {
private Vector orderObjList;
private double orderTotal;
public OrderVisitor() {
orderObjList = new Vector();
}
public void visit(NonCaliforniaOrder inp_order) {
orderTotal = orderTotal + inp_order.getOrderAmount();
}
public void visit(CaliforniaOrder inp_order) {
orderTotal = orderTotal + inp_order.getOrderAmount() +
inp_order.getAdditionalTax();
}
public void visit(OverseasOrder inp_order) {
orderTotal = orderTotal + inp_order.getOrderAmount() +
inp_order.getAdditionalSH();
}
public double getOrderTotal() {
return orderTotal;
}
}
如果有一种新类型的对象(一个新的类),比如一个实现Order接口的DiscountOrder要加入到对象结构中,那么就需要在VisitorInterface接口当中加入一个对应的visit(DiscountOrder)f方法,并且在OrderVistor类当中实现它。
文档与源代码下载地址:http://download.csdn.net/detail/hnzhangshilong/3685894