PHP草根论之设计模式-訪问者模式
关于模式本身的概念,请參考网上其他文章
此处仅仅讨论在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草根论之设计模式-訪问者模式的更多相关文章
- PHP设计模式——訪问者模式
声明:本系列博客參考资料<大话设计模式>,作者程杰. 訪问者模式表示一个作用于某对象结构中的各元素的操作. 它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: w ...
- 设计模式之十五:訪问者模式(Visitor Pattern)
訪问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<De ...
- C++ 设计模式 —— 訪问者(Visitor)
訪问者设计模式的实现借助于两个继承体系, (1)elements:一个是被操作的类(基类及其子类) (2)visitors:一个定义了一系列操作的訪问者(基类及其子类) 訪问者模式是一种行为型设计模式 ...
- JAVA设计模式之 訪问者模式【Visitor Pattern】
一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...
- 《Java设计模式》之訪问者模式
訪问者模式是对象的行为模式.訪问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作须要改动的话,接受这个操作的数据结构则能够保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类 ...
- 设计模式之二十四:訪问者模式(Visitor)
訪问者模式: 定义了一个作用于一个类的一些操作,訪问者模式同意在不改变类的前提下添加一些操作. Represent an operation to be performed on the elemen ...
- Java设计模式(三) Visitor(訪问者)模式及多分派场景应用
基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...
- 设计模式入门之訪问者模式Visitor
//訪问者模式定义:表示一个作用于某对象结构中的各个元素的操作,它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. //从定义上看.这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一 ...
- JAVA设计模式之:訪问者模式
訪问者模式: 一个作用于某对象结构中各元素的操作,使你能够在不改变各元素类数据结构的前提下添加作用于这些元素的新操作. 结构对象是訪问者模式必备条件.且这个结构对象必须存在遍历自身各个对象的方法. 适 ...
随机推荐
- winform基础——数据访问及几个案例
数据访问分为三个部分:(1)创建链接(2)创建与执行命令(3)读取或准备相关数据 一,需要引用的命名空间 using data: using data.SqlClient; 二,创建与数据库的链接—— ...
- JSP的学习(6)——九大隐式对象及其out对象
本篇将介绍JSP中的九大隐式对象,并重点介绍其中的out对象. 我们在之前的博客<JSP的学习(1)——基础知识与底层原理>一文中已经知道,JSP最终要被翻译和转换成Servlet,在转换 ...
- Codeforces 282E Sausage Maximization(字典树)
题目链接:282E Sausage Maximization 题目大意:给定一个序列A.要求从中选取一个前缀,一个后缀,能够为空,当时不能重叠.亦或和最大. 解题思路:预处理出前缀后缀亦或和,然后在字 ...
- 无边无状态栏窗口(使用GetWindowLongPtr设置GWL_EXSTYLE)
通过SetWindowLongPtr来设置窗口样式 var NewStyle: Integer; begin Application.Initialize; Application.MainFormO ...
- 获取Exe文件版本信息的函数(使用GetFileVersionInfo得到TFileVersionInfo结构体,包含12项内容)
Type TFileVersionInfo = Record FixedInfo:TVSFixedFileInfo; {版本信息} Comp ...
- jasperreport报表生成时编译的错误
在帮徐老板解决一个jasperreport报表生成时编译的错误: 刚开始时,加上他所给的 jar 包之后,错误显示为: net.sf.jasperreports.engine.JRException: ...
- git for windows (又名 msysgit)如何记住用户名和密码
创建存储用户名密码的文件 在home文件夹,一般是 C:\Documents and Settings\Administrator 下建立文件 .git-credentials (windows下不允 ...
- [Windows Phone学习笔记]页面之间传递对象
在Windows Phone中,页面之间传递参数就类似Web开发中一样,通过QueryString的形式进行传递,但是如果需要传递对象,则无法通过QueryString形式了,其实也可以,把对象序列化 ...
- 深入浅出Node.js (1) - Node简介
1.1 Node的诞生历程 1.2 Node的命名与起源 1.2.1 为什么是JavaScript 1.2.2 为什么叫Node 1.3 Node给JavaScript带来的意义 1.4 Node的特 ...
- c#超时锁定
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...