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

此处仅仅讨论在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. PHP设计模式——訪问者模式

    声明:本系列博客參考资料<大话设计模式>,作者程杰. 訪问者模式表示一个作用于某对象结构中的各元素的操作. 它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: w ...

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

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

  3. C++ 设计模式 —— 訪问者(Visitor)

    訪问者设计模式的实现借助于两个继承体系, (1)elements:一个是被操作的类(基类及其子类) (2)visitors:一个定义了一系列操作的訪问者(基类及其子类) 訪问者模式是一种行为型设计模式 ...

  4. JAVA设计模式之 訪问者模式【Visitor Pattern】

    一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...

  5. 《Java设计模式》之訪问者模式

    訪问者模式是对象的行为模式.訪问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作须要改动的话,接受这个操作的数据结构则能够保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类 ...

  6. 设计模式之二十四:訪问者模式(Visitor)

    訪问者模式: 定义了一个作用于一个类的一些操作,訪问者模式同意在不改变类的前提下添加一些操作. Represent an operation to be performed on the elemen ...

  7. Java设计模式(三) Visitor(訪问者)模式及多分派场景应用

    基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...

  8. 设计模式入门之訪问者模式Visitor

    //訪问者模式定义:表示一个作用于某对象结构中的各个元素的操作,它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. //从定义上看.这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一 ...

  9. JAVA设计模式之:訪问者模式

    訪问者模式: 一个作用于某对象结构中各元素的操作,使你能够在不改变各元素类数据结构的前提下添加作用于这些元素的新操作. 结构对象是訪问者模式必备条件.且这个结构对象必须存在遍历自身各个对象的方法. 适 ...

随机推荐

  1. Ext JS4百强应用:设置textfield的悬浮提示信息 --第8强

    在Extjs4中有时候我们需要textfield的提示信息,但是我们发现textfield并没有这样的配置项. 这时候我们就要另想方法:我们需要在鼠标悬停在textfield组件的时候进行信息的提示, ...

  2. 深入研究Clang(四) Clang编译器的简单分析

    作者:史宁宁(snsn1984) 首先我们确定下Clang编译器的详细内容和涵盖范围.之前在<LLVM每日谈之二十 Everything && Clang driver>中 ...

  3. iOS开发经常使用宏定义

    iOS开发经常使用宏定义 iOS开发中经常须要获取屏幕宽度高度,为view设置颜色,为imgagView设置图片等,我们都可定义一些宏,随时都可拿来使用,方便开发 <span style=&qu ...

  4. PHP中抽象类与接口的应用场景

    <?php /*** ====笔记部分==== 接口的具体语法: 0:以人类为, class Human 是人的草图 而接口 是零件 可以用多种零件组合出一种新特种来. 1: 如上,接口本身即是 ...

  5. 给c++程序员的一份礼物——常用工具集

    给c++程序员的一份礼物——常用工具集 [声明]如需复制.传播,请附上本声明,谢谢.原文出处:http://morningspace.51.net/,moyingzz@etang.com 所谓&quo ...

  6. vim高级编辑(一)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  7. CodeForces 13E. Holes 分块处理

    正解是动态树,太难了,仅仅好分块处理水之.看了看status大概慢了一倍之多..     分块算法大体就是在找一个折衷点,使得查询和改动的时间复杂度都不算太高,均为o(sqrt(n)),所以总的时间复 ...

  8. [Android学习笔记]使用ListView

    简单使用ListView 关键在于Adatper Adatper用来连接UI与数据源.Adapter既负责提供数据,又负责创建Item视图. 一般步骤: 1.创建list_item.xml,用来创建L ...

  9. Apache Commons IO入门教程(转)

    Apache Commons IO是Apache基金会创建并维护的Java函数库.它提供了许多类使得开发者的常见任务变得简单,同时减少重复(boiler-plate)代码,这些代码可能遍布于每个独立的 ...

  10. Fragment总结

    一.总体工程图: 二.main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android& ...