接  3.5 访问者模式(5.11)

访问者模式的核心是解决a.foo(b)的双分派问题。所以还是给出一个简单的例子。好人打贱人。好人有南拳、北腿类,贱人有鬼子、棒子、B2等。

访问者模式中客户Test会创建各种各样的对象,只调用一个方法 ”好人"的 打(贱人 j) 方法。

/*** * @author yqj2065* @version 2014.9*/
public abstract class 好人{//测试目标 好人 .打(贱人),应该能够找到2*3个方法体public abstract void 打(贱人 j);    abstract void 打JP();abstract void 打Bar();abstract void 打B2();
}
abstract class 贱人{public abstract void cmd(好人 x);// Command
}

按照采用的技术不同,好人中可以使用重载(程序中就需要用instanceof)、可以使用不同方法名(本例采用的方式)——这些方法由贱人们调用,Test不需要知道,所以采用默认访问控制

关键点:不同于GoF,Visitor为客户提供了一个统一的访问接口 打(贱人 j) 

贱人之所以贱,在GoF中它的方法名不是command而是accept。这个方法的目的是将重载的打(贱人 j) 方法区分开来,转换成 x.打JP()等。

import static tool.Print.*;public class 南拳 extends 好人{@Override public void 打(贱人 j){j.cmd(this);}@Override void 打JP(){  pln("南拳.打JP()"); }@Override void 打Bar(){ pln("南拳.打Bar()");}@Override void 打B2(){  pln("南拳.打B2()"); }
}
class JP extends 贱人{@Override public void cmd(好人 x){//命令x.打JP();}
}//其他的北腿、棒子、B2 略

测试:

    public static void test访问者(){好人 m1 = (好人)God.create("3-30-q");//南拳对象好人 m2 = (好人)God.create("3-30-t");//北腿对象贱人 a = (贱人)God.create("3-30-jp");贱人 b = (贱人)God.create("3-30-bar");贱人 c = (贱人)God.create("3-30-b2");// x .打(y);m1.打(a);m1.打(b);m1.打(c);m2.打(a);m2.打(b);m2.打(c);}

输出:
南拳.打JP()
南拳.打Bar()
南拳.打B2()
北腿.打JP()
北腿.打Bar()
北腿.打B2()

现在,好人中增加刀客类,按照南拳的样子写一个。测试代码创建一个刀客对象m3,m3.打(a);m3.打(b);m3.打(c);

输出:

南拳.打JP()....
北腿.打B2()
刀客.打JP()
刀客.打Bar()
刀客.打B2()

与抽象工厂类似,增加一个好人的子类很方便;增加一个贱人的子类,好人的类层次都需要修改。

如果愿意,也可以用一个ArrayList把贱人对象放进去,把贱人叫作Element,JP是具体的元素...

这就是访问者模式的基本结构。

访问者模式-好人打贱人相关推荐

  1. 基于设计模式的学习之旅-----访问者模式(附源码)

    基于设计模式的学习之旅-----访问者模式 1.初始访问者模式 2.什么是访问者模式 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 3.模 ...

  2. 设计模式之访问者模式(Visitor)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  3. 设计模式之访问者模式、例子分析

    1. 定义 访问者模式( Visitor):表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作 2. 使用前提 这个模式是很复杂的模式,一般情况下 ...

  4. PHP设计模式之访问者模式

    访问者模式实际上是让外部类能够获取树形结构的每个节点的对象,对每个对象进行操作的模式,它让我们在不改动原有树形结构的基础上扩展功能,比如统计等等. 在这种模式下,必须有的几个要素: 1.具体的元素对象 ...

  5. C#设计模式系列:访问者模式(Visitor)

    1.访问者模式简介 1.1>.定义 作用于某个对象群中各个对象的操作,可以使在不改变对象本身的情况下,定义作用于对象的新操作. 1.2>.使用频率   低 2.访问者模式结构 2.1> ...

  6. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  7. 设计模式 — 行为型模式 — 访问者模式

    目录 文章目录 目录 访问者模式(Visitor Pattern) 应用场景 代码示例 访问者模式(Visitor Pattern) 数据结构中保存着许多元素,当我们希望改变一种对元素的处理方式时,要 ...

  8. java设计模式---访问者模式

      Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自 己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自 ...

  9. 《JAVA与模式》之访问者模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要 ...

最新文章

  1. 20以内分数化小数表_数与代数之小数
  2. 帝国理工学院(IC)研究人员设计了一种可以解决瘫痪的脑机设备
  3. MySQL——数据库和表的增删改查
  4. Http API笔记
  5. 小C的数学问题 线段树+分治
  6. nginx rewrite 实现二级域名跳转
  7. vant组件二次封装-下拉刷新列表组件
  8. 【开源.NET】 分享一个前后端分离的轻量级内容管理框架
  9. bochs上网镜像怎么上网_bochs win7镜像可上网版
  10. MyBatis从入门到精通(五)—MyBatis插件原理探究和自定义插件实现
  11. 学前端进度慢怎么办?前端学不懂怎么办?
  12. 节日大全c语言程序,C语言 程序设计 节日查询及任务提醒系统-万年历.doc
  13. 史上最详细的5-Why解说|优思学院
  14. 联发科的MT6735和MT6737有什么差别?有哪些MTK芯片资料可以下载的?
  15. cad直线和圆弧倒角不相切_CAD中圆角(fillet)与倒角(chamfer)的技巧总结
  16. LNMP论坛搭建,图案步骤,简单清晰明瞭
  17. ssm毕设项目计件工资管理系统15ik6(java+VUE+Mybatis+Maven+Mysql+sprnig)
  18. 快速搞定开源框架Flowable
  19. Caj论文转pdf(带书签目录)
  20. Word2007 表格换页自动“续表”方法

热门文章

  1. 怎样学好计算机英语,怎样学好小学英语
  2. 【数据分析师---数据可视化】第二章:plotly绘图基础篇
  3. 让字体变的更清晰CSS 中 -webkit-font-smoothing
  4. 维基百科怎么做创建词条?如何创建维基百科?海外营销_一秒推媒体平台
  5. 使用PostgreSQL 9.6 架设mediawiki服务器
  6. Python实现12306自动抢票小程序
  7. 基于Echarts+百度地图+Three.js的数据可视化系统
  8. 07.nodejs文件操作
  9. 活在当下,何必去想过去和将来
  10. 生物类实验室安全管理