一句话

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

概括

解析

情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了;

访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

实例

还是以产品的开发为例,

产品开发分为 硬件和软件两部分。

对应的有 HardwareProduct 和 SoftwareProduct 两个类, 但是现在需要提升原有类的功能, 但是又不想改动到原有的结构,所以就添加额外的“访问者” 来提升功能。

代码列表:

IVisitor.java   - 访问者接口

HardwareProduct.java  具体访问者

IVisitable.java - 元素接口

HardwareProduct.java  - 具体元素

SoftwareProduct.java - 具体元素

TestMain.java - 测试主类

package designptn.vistor;public interface IVisitor {public void visitSoftware(SoftwareProduct product);public void visitHardware(HardwareProduct product);
}
package designptn.vistor;import java.util.Collection;
import java.util.Iterator;public class ConcreteVisitor implements IVisitor {@Overridepublic void visitSoftware(SoftwareProduct product) {// TODO Auto-generated method stubSystem.out.println(product.getProductName());}@Overridepublic void visitHardware(HardwareProduct product) {// TODO Auto-generated method stubSystem.out.println(product.getProductName());}}
package designptn.vistor;public interface IVisitable {public void accept(IVisitor visitor);
}
/**   * @author oscar999   * @date 2013-7-17* @version V1.0   */
package designptn.vistor;public class HardwareProduct implements IVisitable {private String productName;public HardwareProduct(String productName){this.productName = productName;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}@Overridepublic void accept(IVisitor visitor) {// TODO Auto-generated method stubvisitor.visitHardware(this);}}
/**   * @author oscar999   * @date 2013-7-17* @version V1.0   */
package designptn.vistor;public class SoftwareProduct implements IVisitable {private String productName;public SoftwareProduct(String productName){this.productName = productName;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}@Overridepublic void accept(IVisitor visitor) {// TODO Auto-generated method stubvisitor.visitSoftware(this);}
}
package designptn.vistor;public class TestMain {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubIVisitor visitor = new ConcreteVisitor();HardwareProduct hardProduct = new HardwareProduct("hard 1");hardProduct.accept(visitor);SoftwareProduct softProduct = new SoftwareProduct("soft 1");softProduct.accept(visitor);}}

再增加上对象结构角色

修改ConcreteVisitor.java  和TestMain.java

package designptn.vistor;import java.util.Iterator;
import java.util.List;public class ConcreteVisitor implements IVisitor {@SuppressWarnings("rawtypes")public void visitProducts(List<IVisitable> list) {Iterator iterator = list.iterator();while (iterator.hasNext()) {Object o = iterator.next();if (o instanceof IVisitable) {((IVisitable) o).accept(this);}}}@Overridepublic void visitSoftware(SoftwareProduct product) {// TODO Auto-generated method stubSystem.out.println(product.getProductName());}@Overridepublic void visitHardware(HardwareProduct product) {// TODO Auto-generated method stubSystem.out.println(product.getProductName());}}
package designptn.vistor;import java.util.ArrayList;
import java.util.List;public class TestMain {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubConcreteVisitor visitor = new ConcreteVisitor();HardwareProduct hardProduct = new HardwareProduct("hard 1");hardProduct.accept(visitor);SoftwareProduct softProduct = new SoftwareProduct("soft 1");softProduct.accept(visitor);System.out.println("--------------------------");List<IVisitable> list = new ArrayList<IVisitable>();list.add(new HardwareProduct("hard 2"));list.add(new HardwareProduct("hard 3"));list.add(new SoftwareProduct("soft 2"));list.add(new SoftwareProduct("soft 3"));visitor.visitProducts(list);}}

[设计模式-行为型]访问者模式(Vistor)相关推荐

  1. 设计模式-行为型-访问者模式

    访问者模式 文章目录 访问者模式 前言 一.访问者模式(Visitor) 二.角色 三.应用场景 四.代码实现 1. 抽象元素 2.具体元素 3.定义提供给访问者的抽象方法 4.CEO关注KPI 5. ...

  2. 访问者模式的java语言_Java 设计模式系列(二三)访问者模式(Vistor)

    Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以 ...

  3. 设计模式学习之访问者模式

    访问者模式,是行为型设计模式之一.访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是 ...

  4. 设计模式 - 行为型 - 模板模式学习

    现象: 设计模式 - 行为型 - 模板模式学习 介绍: 模板模式的设计思路,在抽象类中定义抽象方法的执行顺序, 并将抽象方法设定为只有子类实现,但不提供独立访问的方法 只能通过已经被安排好的定义方法去 ...

  5. 设计模式学习之访问者模式(Visitor,行为型模式)(21)

    参考:https://www.cnblogs.com/edisonchou/p/7247990.html 在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根 ...

  6. 设计模式笔记(24)---访问者模式(行为型)

    Gof定义 表示一个作用于某对象结构中的各元素的操作.它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作. 动机 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法 ...

  7. 设计模式:访问者模式-vistor

    表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作 访问者模式的优点 1.符合单一职责原则:凡是适用访问者模式的场景中,元素类中需要封装在访问者中 ...

  8. 设计模式(二) 访问者模式 Vistor

    在软件开发中,经常需要用到多态,继承等机制,下面是很常见的一段代码 class Brand { public:virtual void productShoe() = 0; }class Nike : ...

  9. 设计模式--23、访问者模式

    访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作.例如处方单中的各种药品信息就是被访问 ...

最新文章

  1. 基于深度信念网络的脑电图情感分类
  2. sql连oracle链接服务器
  3. 后端开发需要学什么_都2020年了,还在纠结学什么语言?| 后端篇
  4. vs中实现声音录制并保存到指定文件_别人直播怎么录制视频?这三种方法你可以不知道...
  5. sql server数据表转换成xml
  6. 页面显示拒绝访问请求
  7. web.xml 配置 contextConfigLocation
  8. 如何列出包含给定提交的分支?
  9. 贼好理解,这个项目教你如何用百行代码搞定各类NLP模型
  10. 博文视点Open Party——PPT演示专家秘技 报名中
  11. 连接打印机错误0x000000bcb解决方法
  12. linux服务器中安装SVN,linux服务器安装svn并上传项目
  13. 物联卡、物联网卡、物联网语音卡你能分清吗?
  14. svg基础+微信公众号交互(二)
  15. osi模型:七层模型介绍_什么是OSI(开放系统互连)模型?
  16. GitHub 这8大超实用小技巧,99.9%的人都不知道!
  17. 甘特图:项目进度管理的必备工具
  18. 音乐计算机在线应用,计算机音乐技术在传统音乐创作中的应用及影响
  19. java三角形边长_利用java解决三角形角度问题
  20. 电控测试团队建设回顾

热门文章

  1. Xcode6 创建静态库
  2. 《Unix/linux编程实践教程》------重定向程序的I/O
  3. document.execCommand() 解析
  4. SilverLight学习笔记--关于Silverlight资源文件(如:图片)的放置位置及其引用
  5. 【转载】中国小吃(英文表达)
  6. SqlServer2012自增主键跳跃增长的问题解决方案
  7. Python3 异常: name ‘basestring‘ is not defined
  8. 【收藏】史上最全推荐系统传统算法合集
  9. 【白皮书下载】2020年数字营销与商业增长白皮书.pdf
  10. 倒角距离(Chamfer distance)和earth mover‘s diatance