java软件体系设计模式-----访问者

说明:

访问者模式可用于设计一个集合操作,该操作跨越由包含在同一类层次结构当中的一类对象组成的一个对象集。访问者模式允许在不改变对象集所属类的前提下定义操作。


设计思想:

对象集中的对象所属的类需要定义一个方法。

对执行访问者操作感兴趣的客户需要做到:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值