声明:本系列博客參考资料《大话设计模式》,作者程杰。

訪问者模式表示一个作用于某对象结构中的各元素的操作。

它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作。

UML类图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamhxMDExMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

角色:

1.抽象訪问者(State):为该对象结构中详细元素角色声明一个訪问操作接口。

该操作接口的名字和參数标识了发送訪问请求给详细訪问者的详细元素角色,这样訪问者就能够通过该元素角色的特定接口直接訪问它。

2.详细訪问者(Success):实现訪问者声明的接口。

3.抽象元素(Person):定义一个接受訪问操作accept(),它以一个訪问者作为參数。

4. 详细元素(Man):实现了抽象元素所定义的接受操作接口。

5.结构对象(ObjectStruct):这是使用訪问者模式必备的角色。

它具备下面特性:能枚举它的元素。能够提供一个高层接口以同意訪问者訪问它的元素;如有须要,能够设计成一个复合对象或者一个聚集(如一个列表或无序集合)。

核心代码:

<span style="color:#000000;"><?php
/**
* Created by PhpStorm.
* User:Jang
* Date:2015/6/11
* Tim: 9 :40
*/ /*男人这本书的内容要比封面吸引人;女人这本书的封面通常比内容更吸引人
男人成功时。背后多半有一个伟大的女人;女人成功时,背后多半有一个失败的男人
男人失败时,闷头喝酒,谁也不用劝。女人失败时,眼泪汪汪,谁也劝不了
男人恋爱时,凡事不懂也要装懂。女人恋爱时。遇事懂也要装作不懂*/
//抽象状态
abstract class State
{
protected $state_name; //得到男人反应
public abstract function GetManAction(VMan $elementM);
//得到女人反应
public abstract function GetWomanAction(VWoman $elementW);
} //抽象人
abstract class Person
{
public $type_name; public abstract function Accept(State $visitor);
} //成功状态
class Success extends State
{
public function __construct()
{
$this->state_name="成功";
} public function GetManAction(VMan $elementM)
{
echo "{$elementM->type_name}:{$this->state_name}时,背后多半有一个伟大的女人。<br/>";
} public function GetWomanAction(VWoman $elementW)
{
echo "{$elementW->type_name} :{$this->state_name}时。背后大多有一个不成功的男人。<br/>";
}
} //失败状态
class Failure extends State
{
public function __construct()
{
$this->state_name="失败";
} public function GetManAction(VMan $elementM)
{
echo "{$elementM->type_name}:{$this->state_name}时,闷头喝酒,谁也不用劝。<br/>";
} public function GetWomanAction(VWoman $elementW)
{
echo "{$elementW->type_name} :{$this->state_name}时。眼泪汪汪,谁也劝不了。<br/>";
}
} //恋爱状态
class Amativeness extends State
{
public function __construct()
{
$this->state_name="恋爱";
} public function GetManAction(VMan $elementM)
{
echo "{$elementM->type_name}:{$this->state_name}时,凡事不懂也要装懂。<br/>";
} public function GetWomanAction(VWoman $elementW)
{
echo "{$elementW->type_name} :{$this->state_name}时,遇事懂也要装作不懂。<br/>";
}
} //男人
class VMan extends Person
{
function __construct()
{
$this->type_name="男人";
} public function Accept(State $visitor)
{
$visitor->GetManAction($this);
}
} //女人
class VWoman extends Person
{
public function __construct()
{
$this->type_name="女人";
} public function Accept(State $visitor)
{
$visitor->GetWomanAction($this);
}
} //对象结构
class ObjectStruct
{
private $elements=array();
//添加
public function Add(Person $element)
{
array_push($this->elements,$element);
}
//移除
public function Remove(Person $element)
{
foreach($this->elements as $k=>$v)
{
if($v==$element)
{
unset($this->elements[$k]);
}
}
} //查看显示
public function Display(State $visitor)
{
foreach ($this->elements as $v)
{
$v->Accept($visitor);
}
}
}</span>

測试client代码:

header("Content-Type:text/html;charset=utf-8");
//------------------------訪问者模式--------------------
require_once "./Visitor/Visitor.php";
$os = new ObjectStruct();
$os->Add(new VMan());
$os->Add(new VWoman()); //成功时反应
$ss = new Success();
$os->Display($ss); //失败时反应
$fs = new Failure();
$os->Display($fs); //恋爱时反应
$ats=new Amativeness();
$os->Display($ats);

适用场景及优势:

1) 一个对象结构包括非常多类对象。它们有不同的接口,而你想对这些对象实施一些依赖于其详细类的操作。

2) 须要对一个对象结构中的对象进行非常多不同的而且不相关的操作。而你想避免让这些操作“污染”这些对象的类。

Visitor模式使得你能够将相关的操作集中起来定义在一个类中。

3) 当该对象结构被非常多应用共享时,用Visitor模式让每一个应用仅包括须要用到的操作。

4) 定义对象结构的类非常少改变。但常常须要在此结构上定义新的操作。

改变对象结构类须要重定义对全部訪问者的接口,这可能须要非常大的代价。

假设对象结构类常常改变。那么可能还是在这些类中定义这些操作较好。

欢迎关注我的视频课程。地址例如以下,谢谢。

PHP面向对象设计模式

PHP设计模式——訪问者模式的更多相关文章

  1. PHP草根论之设计模式-訪问者模式

    关于模式本身的概念,请參考网上其他文章 此处仅仅讨论在PHP实际开发过程中的应用 此模式适用范围极为受限,适用情景: 1.适用于项目维护过程,不适用于项目开发过程 2.新增需求,要求为一个/多个类添加 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. LOJ#505. 「LibreOJ β Round」ZQC 的游戏(最大流)

    题意 题目链接 Sol 首先把第一个人能吃掉的食物删掉 然后对每个人预处理出能吃到的食物,直接限流跑最大流就行了 判断一下最后的最大流是否等于重量和 注意一个非常恶心的地方是需要把除1外所有人都吃不到 ...

  2. 用eclipse 搭建struts2环境

    一,下载struts2对应的jar包,(http://struts.apache.org/download.cgi#struts2514.1),我一般下载struts2.3版本的 二,打开eclips ...

  3. PGIS下载离线地图 SQLite+WPF

    项目是超高分辨率屏幕墙,实时在线加载PGIS地图速度会比较慢,造成屏幕大量留白.于是使用地图缓存,事先把这个区块的地图全部down下来,使用Sqlite数据库保存.留存. //Task taskDow ...

  4. Selenium win7+selenium2.0+python+JetBrains PyCharm环境搭建

    win7+selenium2.0+python+JetBrains PyCharm环境搭建 by:授客 QQ:1033553122 步骤1:下载python 担心最新版的支持不太好,这里我下载的是py ...

  5. m6c2g核心板使用笔记

    周立功官网资料下载链接:http://www.zlg.cn/ipc/down/down/id/84.html 平台:致远M6G2C-L Cortex-A7工控核心板 主要参考文档:EPC_loT_M6 ...

  6. ES6 箭头函数下的this指向

    在javscript中,this 是在函数运行时自动生成的一个内部指针,它指向函数的调用者. 箭头函数有些不同,它的this是继承而来, 默认指向在定义它时所处的对象(宿主对象),而不是执行时的对象. ...

  7. unityShader CGINCLUDE关键字

    unityshader中经常见到CGPROGRAM,除此之外还有一个CGINCLUDE关键字. 二个关键字都是用ENDCG来结束,但是用法完全不一样. CGINCLUDE和ENDCG内可以插入一些sh ...

  8. 关于Java单例模式中懒汉式和饿汉式的两种类创建方法

    一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...

  9. FAST特征点检测算法

    一 原始方法 简介 在局部特征点检测快速发展的时候,人们对于特征的认识也越来越深入,近几年来许多学者提出了许许多多的特征检测算法及其改进算法,在众多的特征提取算法中,不乏涌现出佼佼者. 从最早期的Mo ...

  10. js实现双向链表

    1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...