关于模式本身的概念,请參考网上其他文章

此处仅仅讨论在PHP实际开发过程中的应用

此模式适用范围极为受限,适用情景:

1.适用于项目维护过程,不适用于项目开发过程

2.新增需求,要求为一个/多个类添加一个/多个,同样/相似的方法

3.原有代码不能改动或扩展

4.原有类已经预留了一个为本模式准备的接口.

以上,3,4非常难同一时候在产品维护过程中同一时候出现.

需求:

1.一组对象,同属一个父类或分属不同父类,使用某一数据结构组成一个数据集,此处的数据结构能够是概念意义上的队列,栈,集合,树,图或实际意义上的一维或多维数组,仅仅要能够遍历就可以

2.项目须要对以上对象添加一个操作,以便在遍历整组对象时,同名调用.

实现过程:

1.原有代码中,以上对象所属的类,事先预留了一个扩展接口,能够叫做accept(奇怪的名字)

Class ElementA{

public function accept(VisitorBase $v){

$v->visitA($this);

}

}

class ElementB{

public function accept(VisitorBase $v){

$v->visitB($this);

}

}

依据以上,我们当然要事先定义一个VisitorBase的抽象接口

interface VisitorBase {

function visitA(ElementA $eleA);

function visitB(ElementB $eleB);

}

2.新的代码中,我们为新增的操作创建一个类,叫做VisitorX(訪问者,又是一个奇怪的名称),假设有还有一个操作,能够定义为VisitorY,均实现了VisitorBase接口

class VisitorX implements VisitorBase{

public function visitA(ElementA $eleA){

//此处能够訪问元素A的方法以处理详细事务

$eleA->someFunc();

}

public function visitB(ElementB $eleB){

……

}

}

3.新的代码中,我们能够遍历,以数组为例(这个最经常使用了)

$x=new VisitorX;

foreach($elementArray as $element){

$element->accept($x);

}

以上将遍历全部元素(不管是否同一父类),对每个元素运行VisitorX类中的对应操作.

草根观点:

1.凭什么原有代码不让改动?仅仅是加个方法而已.

2.我不改原有代码,还不让我继承一下,扩展一个方法?

3.原有代码定义扩展接口了么?

曾经的程序猿有这么前瞻?

4.仅仅要有其他方式实现同等功能,尽量不要使用此设计模式, 这将导致对同一对象的操作代码分散在程序的不同位置,不利于进一步的维护与改动.

5.可考虑的替代实现方法:

A.改动原有类,添加一个同名方法

B.扩展(继承)原有类,添加一个同名方法

C.假设一定要将不同类的同一操作的代码集中在一起,那么考虑Trait吧

PHP草根论之设计模式-訪问者模式相关推荐

  1. 设计模式之十五:訪问者模式(Visitor Pattern)

    訪问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<De ...

  2. 3.5 訪问者模式(5.11)

    訪问者模式的学习.能够从以下方面入手. 假设一门编程语言支持双分派(多分派).那么訪问者模式就没有太大的存在价值.其实,看完Java模拟 双分派Double Dispatch,你应该自己做最后的题目: ...

  3. python设计模式23-访问者模式

    1. 访问者模式(Visitor)介绍 UML类图 角色介绍 Visitor:接口或者抽象类,定义了对每个 Element 访问的行为,它的参数就是被访问的元素,它的方法个数理论上与元素的个数是一样的 ...

  4. 使用WinINet和WinHTTP实现Http訪问

    使用WinINet和WinHTTP实现Http訪问 飘飘白云 l_zhaohui@163.com 2007-11-30 Http訪问有两种方式,GET和POST,就编程来说GET方式相对简单点,它不用 ...

  5. 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序

    Q 在NT/2000/XP中,我想用VC编写应用程序訪问硬件设备,如获取磁盘參数.读写绝对扇区数据.測试光驱实际速度等,该从哪里入手呢? A 在NT/2000/XP中,应用程序能够通过API函数Dev ...

  6. 使用c#訪问Access数据库时,提示找不到可安装的 ISAM

    使用c#訪问Access数据库时,提示找不到可安装的 ISAM.例如以下图: 代码例如以下: connectionString = "Provider=Microsoft.Jet.OLEDB ...

  7. HDFS简单介绍及用C语言訪问HDFS接口操作实践

    一.概述 近年来,大数据技术如火如荼,怎样存储海量数据也成了当今的热点和难点问题,而HDFS分布式文件系统作为Hadoop项目的分布式存储基础,也为HBASE提供数据持久化功能,它在大数据项目中有很广 ...

  8. C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符

    1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.可是由于他们改变的正好是所操作对象的状态.所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本号,因此.我们应该 ...

  9. 宿主机訪问virtualBox中Ubuntu

    斌斌 (给我写信) 原创博文(http://blog.csdn.net/binbinxyz).转载请注明出处! 使用NAT模式.就是让虚拟系统借助NAT(网络地址转换)功能.不须要你进行不论什么其它的 ...

最新文章

  1. matlab gui数据类型,MatLab GUI 数据传递
  2. 优化算法、梯度下降、SGD、Momentum、Adagrad、Adam
  3. [翻译]Axure-Basic Interactions-原型设计工具Axure学习-第1.3节
  4. 课程及其编码字典python_【课程15】Python字典
  5. 密码学-hash加密
  6. java list用法 包,java list用法示例详解
  7. Native与H5交互的一些解决方法
  8. java 对象的上转型对象(父类)
  9. normalize函数_【ADAMS】矩阵/数组函数
  10. ssas如何创建分区_如何基于SSAS信息创建Excel报告
  11. FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD
  12. ajax前台获取json,ajax与json 获取数据并在前台使用简单实例
  13. 关于项目404解决方法:前提条件:项目路径都是正确的
  14. 局域网计算机维护工具,局域网共享工具,教您局域网共享工具
  15. linux怎么卸载vsftpd软件,vsftpd配置详解之软件安装和卸载
  16. Exadata想要补装Oracle 11g的注意事项
  17. 小米开源:站在巨人肩膀上的创新
  18. No administrator rights detected!
  19. AT24Cxx读写全面理解
  20. 华为软开云4--玩转流水线

热门文章

  1. Rootkit Hunter Sourcecode Learning
  2. hibernate QBC检索方式查询
  3. whitepages 被关闭_除了滑动关闭APP影响电池寿命,还有哪些操作触碰到了你的知识盲区?...
  4. 【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 ( 集成 mobile-ffmpeg 框架 | 完整代码示例 )
  5. 【错误记录】Android 应用运行报错 ( java.lang.VerifyError: Verifier rejected class androidx. | 逆向中遇到的问题 )
  6. 【OpenGL】六、Visual Studio 2019 配置 GitHub ( 提取和拉取简介 | 拉取远程代码 )
  7. 【Android 内存优化】libjpeg-turbo 函数库交叉编译 ( libjpeg-turbo 函数库下载 | libjpeg-turbo 编译文档 | 环境准备 | NASM 安装 )
  8. 【Android 系统开发】 Android 系统启动流程简介
  9. [Spring cloud 一步步实现广告系统] 19. 监控Hystrix Dashboard
  10. Centos 7和Centos 6的防火墙