在开发中,我们可能会经常碰到客户提了一新的需求,那么在现有的类实现新的需求呢?通常的做法是添加新的方法。但是有时候我们只能看到接口,而根本无法看到其接口实现。这个时候我们就无法往接口里添加接的方法。但是,开发人员能够多大设计的时候采用Visitor模式的话,结果就大不一样了。

Visitor模式就是让代码用户能够在不修改现有类层次结构的情况下,定义该类层次结构的操作。

例子:

关于访问者模式的JE上的例子比较多,而且争议也比较大。下面就举出个常见的Visitor模式的例子,欢迎拍砖。

如一个公司里有老板,经理,员工三种角色,每个角色都继续Human这个类,对于Human这个类,我们定义为抽象的

public abstract class Human {protected int id;//该人物所管理的人员,如果是老板那么那就可管理经理protected List<? extends Human> list = new ArrayList<Human>();public List<? extends Human> getList() {return list;}public void setList(List<? extends Human> list) {this.list = list;}public int getId() {return id;}public void setId(int id) {this.id = id;}public  void accept(Visitor visitor){}
}

其三种角色都继续这个Human类:

public class Boss extends Human {public Boss(int id){this.id = id;}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String toString(){return new StringBuffer("Manager the id:"+id).toString();}
}public class Manager extends Human {public Manager(int id){this.id = id;}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String toString(){return new StringBuffer("Manager the id:"+id).toString();}
}public class Employee extends Human{public  Employee(int id){this.id = id;}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}public String toString(){return new StringBuffer("Employee the id:"+id).toString();}}

在我们构造这些公司的成员时, 我假设用如下方法构造:

Boss boss = new Boss(1);List<Manager> managers = new ArrayList<Manager>();for(int i =2;i<10;i++){Manager manager = new Manager(i);List<Employee> employees = new ArrayList<Employee>();int k = i*10;for(int j = k;j<k+8;j++){employees.add(new Employee(j));}manager.setList(employees);managers.add(manager);}boss.setList(managers);

于是这个时候,我想查询员工号为20的员工的相关信息.当然我可以直接从Boss开始,然后遍历他的List列表,以及子列表。实现如下:

 public static Human getHuman(Human human, int id) {if (human.getId() != id) {List<Human> ms = (List<Human>) human.getList();for (Human h : ms) {if(getHuman(h,id)!=null){return getHuman(h,id);}else{return null;}}return null;} else {return human;}}

但是我们想用访问者模式来实现它,于是我们定义一个访问者接口:

/*** 访问员工接口* @author Administrator**/
public interface Visitor {public void visit(Employee employee);public void visit(Human human);
}

接口实现如下:

public class FindVisitor implements Visitor{private int soughtId;private Human found;public void visit(Employee employee) {if(found==null&&employee.getId()==soughtId){found=employee;}}public void visit(Human human) {if(found==null&&human.getId()==soughtId){found=human;return;}List<? extends Human> list = human.getList();for(Human e:list){if(found==null)e.accept(this);}}public Human find(Human mc,int id){found = null;soughtId = id;mc.accept(this);return found;}}

下面做一下简单的测试吧:

FindVisitor fv =new FindVisitor();
Human human = fv.find(boss, 20);
System.out.println("find:"+ human);

小结:

访问者模式可以让我们在不改变类层次结构中的类的情况下,为该类层次结构定义新的操作。如上面的例子,如果想添加新的需求,如要找某个员工号,并修改员工信息,于是我们可以新增接口方法,并添加实现。在类层次结构中添加访问器将调用accept()方法,accept()方法通过采用”两次分开“技术将调用结果返回给访问器类。visit()方法定义在访问器类中,类层次结构中的某个类对象可以根据其类型调用合适的visti()方法。

访问器类的开发人员必须清楚将要访问的类层次结构的全部或者部分设计细节。另外,在设计访问器类的时候,我们必须特别注意被访问的对象模型中可能会出现环状结构。考虑到这些问题, 一些开发人员常常会有意避免使个访问者框框。习惯地使用其他方案替换。一般而言,软件开发团队需要根据自己所采用的软件开发方法学,根据项目组以及具体项目的具体情况使用访问者模式 。

设计模式之略见一斑(Visitor访问者模式)相关推荐

  1. 设计模式——Visitor(访问者)模式

    目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 Java实际应用举例--以ASM技术为例 4.1 被访问对象--ClassReader 4.2 Visitor--Cla ...

  2. [导入]C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式.zip(10.41 MB)...

    讲座内容: 本培训课程探讨GoF23之 Visitor 访问者模式的意图.动因.原理.应用场景与C#语言实现,以及该模式在.NET框架程序设计中的具体应用. 课程讲师: 李建忠 上海祝成信息科技有限公 ...

  3. Java 设计模式之 Visitor 访问者模式

    Visitor 访问者模式适用的场景是,存在某个容器,里面的组成部分不会发生变化,对这些组成部分的访问,不是由这个容器决定,而是交给访问者决定. 举个生活中的例子,比如稻草人,卖包,卖鞋子这些固定的消 ...

  4. C#设计模式之二十一访问者模式(Visitor Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第九个模式,该模式是[访问者模式],英文名称是:Visitor Pattern.如果按老规矩,先从名称上来看看这个模式,我根本不能获得任 ...

  5. 访问者模式 php,php设计模式 Visitor 访问者模式

    /** * 访问者模式 * * 表示一个作用于某对象结构中的各元素的操作,可以在不改变各元素的类的前提下定义作用于这些元素的新操作 * */ abstract class Visitor { abst ...

  6. java visitor_Java设计模式(三) Visitor(访问者)模式及多分派场景应用

    基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作可以借助新的visitor实现,降低了操作间的耦合性 访问者可以将数据结构和对数据的操作解耦,使得增加对数据结构的操作不需要 ...

  7. 设计模式之禅【访问者模式】

    真刀实枪之访问者模式 从员工的隐私说起 通过组合模式可以把整个员工的人员信息都整合起来形成一张企业员工信息树 通过迭代器模式可以遍历公司所有的员工 现在要把公司的所有人员的信息都汇总起来,那该怎么办, ...

  8. 浅谈Visitor访问者模式

    一.前言 什么叫访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+对其进行处理就叫作访问,那么我们平常是怎么访问的 ...

  9. 【Java设计模式】简单学访问者模式——我的选择是,Yes

    目录 说明 实现方式 优点 缺点 应用场景 其他链接 说明 行为型模式之一,其他还有命令模式.模板方法模式.迭代器模式.观察者模式.中介者模式.备忘录模式.解释器模式(Interpreter模式).状 ...

最新文章

  1. 《2021人脸识别行业白皮书》发布 拥挤安防还有多少空间?
  2. WSAGetLastError:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断 的解决
  3. 倡导国际农民丰收节贸易会-万祥军:中国-中东欧谋定启动.
  4. SpringBoot+Echarts实现请求后台数据显示饼状图
  5. 腾讯云副总裁答治茜:移动互联网破局要借助“三张网”
  6. Java开发代码规范之编程规约---命名风格
  7. hibernate get() load() 区别
  8. win与linux渊源,微软与Linux从对立走向合作,WSL是如何诞生的
  9. 公主病 - 百度百科
  10. springmvc错点集结
  11. Iometer存储测试工具参数说明-5 存储规格选项
  12. 计算机网络技术教程-董文磊-专题视频课程
  13. editplus自动换行html,EditPlus如何自动换行
  14. DOS计算机设置登录密码,bios开机密码怎么设置或取消?bios开机密码操作介绍
  15. GAEfan qiang教程
  16. 软件测试需要学什么?全网最全软件测试必备7大技能详解,摇身一变资深测试
  17. Jvav第一天学习内容
  18. Vue+PHP实现个人博客系统
  19. 【产业互联网周报】阿里增持菜鸟;微信支付宝向外国游客开放服务;百度推“区块链+智能城市”建设...
  20. android中的小彩蛋,天天使用的Android手机,你知道隐藏小彩蛋在哪里吗?

热门文章

  1. 2022接口自动化测试工具Postman 使用教程
  2. 综合使用各种布局和控件创建出计算器界面
  3. webrtc在民用安防行业中的应用
  4. 淘宝以图搜图批量搜1688同款软件
  5. 东南亚国家的商标注册小知识
  6. iOS -- 学习资料总结(转载)
  7. 手机竖屏和横屏旋转解决
  8. 基于STM32的无线模拟病房呼叫系统
  9. 深空探测简介:我们的目标是星辰大海!
  10. 三维扫描处理数据化的分析