设计模式目录
http://blog.csdn.net/fenglailea/article/details/52733435
风.fox

访问者模式

封装一些作用于某种数据结构中的各个元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素的新的操作

通用类图

组成

  • 抽象访问者 Vistor
    抽象接口或类,声明访问者可以访问那些元素,具体到程序中就是Visit方法的参数定义那些对象时可以被访问的
  • 具体访问者 ConcreteVistor
    它影响访问者访问到一个类后该怎么干,要做什么事情
  • 抽象元素 Element
    接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义
  • 具体元素 ConcreteElement
    实现accept方法,通常是visitor.vist(this)
  • 结构对象 ObjectStruture
    元素产生者,一般容纳在多个不同类,不同接口的容器,如List,Set,Map等

通用源码

JAVA

//抽象元素
public abstract class Element{//定义业务逻辑public abstract void doSomething();//允许谁来访问public abstract void accept(IVisitor visitor);
}
//具体元素
public class ConcreteElement1 extends Element{// 业务逻辑public  void doSomething(){...}//允许谁来访问public void accept(IVisitor visitor){visitor.visit(this);}
}
public class ConcreteElement2 extends Element{// 业务逻辑public  void doSomething(){...}//允许谁来访问public void accept(IVisitor visitor){visitor.visit(this);}
}
//抽象访问者
public interface IVisitor{//可以访问哪些对象public void visit(ConcreteElement1 el1);public void visit(ConcreteElement2 el2);
}
//具体访问者
public class Visitor implements IVisitor{//可以访问哪些对象public void visit(ConcreteElement1 el1){el1.doSomething();}public void visit(ConcreteElement2 el2){el2.doSomething();}
}
//结构对象
public class ObjectStruture{//对象生成器,这里通过一个工厂方法模式模拟public static Element createElement{Random rand=new Random();if(rand.nextInt(100)>50{return new ConcreteElement1();}else{return new ConcreteElement2();}}
}
//场景类
public class Client{public static void main(String[] args){for(int i=0;i<10;i++){//获得元素对象Element el=ObjectStruture.createElement();//接受访问者访问el.accept(new Visitor);}}
}

优点

符合单一职责原则
优秀的扩展性
灵活性非常高

缺点

具体元素对访问者公布细节
具体元素变更比较困难
违背了依赖导致原则

使用场景

一个对象结果包含很多类对象,他们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作,也就说是用迭代器模式已经不能胜任的情景
需要对一个对象结构中的对象进行很多不同并且不相关的操作,而你想避免让这些操作“污染”这些对象的类

适配器模式之访问者模式相关推荐

  1. 设计模式之适配器模式、委派模式、访问者模式、工厂模式、桥接模式(双维度扩展)

    设计模式之适配器模式.委派模式.访问者模式.工厂模式.观察者-发布订阅模式 设计模式分类: 适配器模式(Adapter Pattern) 定义 使用场景 代码实现 写法一:类适配器 写法二:对象适配器 ...

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

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

  3. Java设计模式之行为型:访问者模式

    背景: 去医院看病时,医生会给你一个处方单要你去拿药,拿药我们可以分为两步走: (1)去柜台交钱,划价人员会根据处方单上的药进行划价,交钱. (2)去药房拿药,药房工作者同样根据处方单给你相对应的药. ...

  4. 设计模式笔记--访问者模式

    常用设计模式有23中,分为: 创建型模式(主要用于创建对象) 1.单例模式    2.工厂方法模式    3.抽象工厂模式    4.建造者模式     5.原型模式  行为型模式 (主要用于描述对象 ...

  5. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

  6. 设计模式之观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式

    前言 这是设计模式的最后一章,包含了剩余的 行为型模式 中的 观察者模式.中介者模式.迭代器模式.访问者模式.备忘录模式.解释器模式 系列文章 第一章:7种设计原则之单一职责原则.接口隔离原则.依赖倒 ...

  7. 【每天一个java设计模式(二十三)】 - 访问者模式

    在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者 ...

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

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

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

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

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

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

最新文章

  1. 容器 vector :为何要有reserve
  2. Go 语言编程 — 高级数据类型 — Slice 切片
  3. 率土之滨显示未选择服务器是什么意思,率土之滨随机合服方案热门问题解答
  4. oracle用户登录的认证方式
  5. Ruby BigDecimal库拒绝服务漏洞
  6. 滤波器开发之三:基于算数平均的阶进平滑滤波器
  7. 别人家的工程师:阿里巴巴工程师有了新帮手,AI可帮助修Bug
  8. 基础编程题之查找组成一个偶数最接近的两个素数
  9. php对象方法调用静态方法,php面向对象之静态方法使用
  10. 年轻人“颜值消费”崛起 分期乐联手屈臣氏发力95后美妆护理市场
  11. Bootstrap学习(一)
  12. cfilefind 能找ftp 服务器上的文件夹吗?,将ftp目录映射为本地盘符
  13. bzoj 1650: [Usaco2006 Dec]River Hopscotch 跳石子(二分)
  14. 耿建超英语语法---连词
  15. CentOS6.9+Hadoop2.7.3+Hive1.2.1+Hbase1.3.1+Spark2.1.1
  16. 《编写可维护的 JavaScript》读书笔记第7章:事件处理
  17. 西刺代理python_python爬取西刺代理所有数据 !
  18. Windows 恢复使用老版的图片查看器
  19. 【兴趣书签】让人深陷其中的科幻小说
  20. 数据流通利用 | 数据产权研究综述

热门文章

  1. 通过JS控制textarea的输入长度
  2. C语言内存地址对齐详解
  3. 孙鑫VC学习笔记:第一讲 Windows程序内部运行原理
  4. 二叉树层次遍历c语言_LeetCode 树 107.二叉树的层次遍历Ⅱ
  5. 拓端tecdat|如何用R语言绘制生成正态分布图表
  6. 一个bootstrap.css的使用案例
  7. 【Pycharm】连接远程服务器并进行代码上传、调试
  8. RuntimeError: all elements of input should be between 0 and 1
  9. Pytorch state_dict介绍
  10. 深度学习新星 | 图卷积神经网络(GCN)有多强大?