设计模式之Visitor(送礼篇)

今年过年不收礼,收礼只收脑白金。听到这暗示性的广告词,我的脑袋突然一亮。因为最近因为要办某事,必须要给单位的领导要表示一下。到底送什么,还真让人头痛,还好有脑白金,奶奶的。。。,腐败啊,罪过!
          首先要对送礼的对象进行分析,单位有两个领导,一正,一副。因此给不同的领导送的礼也是不同的(哈,收入要和产出成正比吗),好了言归正传。
         1 、在这里,先把领导定义成一个接口类:
          public interface Leader{
          public void accept(Visitor visitor); // 主要任务 ---- 收 visitor (拜访者)的礼
          }
          在把拜访者定义成另一个接口类:
          public interface Visitor
          {
          public void visitFirstHand(FirstHand first); // 拜访一把手(带的礼物)
          public void visitSecondHand(SecondHand second); // 拜访二把手(带的礼物)
          public void visitCollection(Collection collection); // 判断是拜访一把手还是二把手
          }
         2 、下面我们要对这两个接口进行实现:
          A :一把手
          public class FirstHand implements Leader {
          private String value; // 注意此处是 String
          public FirstHand (String string) {// 一把手的构造函数
          value = string;
          }
          public String getValue() { // 获得礼物
          return value;
          }
          // 定义 accept 的具体内容 这里是很简单的一句调用
          public void accept(Visitor visitor) {
          visitor.visitFirstHand (this); // 接收拜访人送的礼
          }
          }
          B :二把手
          public class SecondHand implements Leader {
          private Float value; // 注意此处是 Float
          public SecondHand (Float string) {// 二把手的构造函数
          value = string;
          }
          public Float getValue() { // 获得礼物
          return value;
          }
          // 定义 accept 的具体内容 这里是很简单的一句调用
          public void accept(Visitor visitor) {
          visitor.visitFirstHand (this); // 接收拜访人送的礼
          }
          }
          C :拜访人(我)
          public class visitMe implements Visitor{
          public void visitCollection(Collection collection) {
          Iterator iterator = collection.iterator();
          while (iterator.hasNext()) {
          Object o = iterator.next();
          if (o instanceof Leader) // 判断要送给哪个领导
          ((Leader)o).accept(this); // 不同的领导进入不同的实现类
          }
          }
          public void visitFirstHand (FirstHand first) {
          System.out.println(" 送的礼是: "+ first.getValue());
          }
          public void visitSecondHand (SecondHand second) {
          System.out.println(" 送的礼是: " + second.getValue());
          }
          }
         3 、编写测试类:
          public class test {
          public static void main(String args[]){
          Visitor visitor = new visitMe ();
          FirstHand present = new FirstHand (" 十盒脑白金 ");
          visitor.visitFirstHand (present);
          Collection list = new ArrayList();
          list.add(new FirstHand (" 十盒脑白金 "));
          list.add(new SecondHand (new Float(" 一斤小点心 "))); // 为了说明不同,如要运行,要做类型转换。
          visitor.visitCollection(list);
          }
           4 、说明:
          A : 代码只用来学习 Visitor 模式 , 要运行的话,必须要做一点改动。
          B: FirstHand , SecondHand 只是一个个具体实现,实际上还可以拓展为更多的实现,整个核心奥妙在 accept方法中,在遍历 Collection 时,通过相应的 accept 方法调用具体类型的被访问者。这一步确定了被访问者类型
          C :使用访问者模式是对象群结构中 (Collection) 中的对象类型很少改变,也就是说领导很少变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值