访问者模式:
  表示作用于某个对象结构中的各个元素的操作。它使你可以在不改变各个元素类的前提下定义作用于这些元素的操作。

角色:
  1)抽象访问者:为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
  2)具体访问者:实现访问者声明的接口。
  3)抽象元素:定义一个接受访问操作accept(),它以一个访问者作为参数。
  4) 具体元素:实现了抽象元素所定义的接受操作接口。
  5)结构对象:这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)

UML类图:

  

适用场景及优势:
  1) 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
  2) 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor模式使得你可以将相关的操作集中起来定义在一个类中。
  3) 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
  4) 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。

代码实现:

<?php
header("Content-type:text/html;Charset=utf-8"); //抽象访问者接口,定义具体访问者要实现的方法,访问不同元素调用不同方法
abstract class Visitor{
abstract function eat($place);
abstract function work($place);
}
//具体访问者角色
class ConcreteVisitor extends Visitor{
//回家吃饭
function eat($place){
echo "回".$place->name."吃饭";
}
//去公司上班
function work($place){
echo "去".$place->name."上班";
}
} //抽象元素,定义一个接受访问操作acceptVisitor(),它以一个访问者作为参数。
abstract class Place{
abstract function acceptVisitor(Visitor $visitor);
} //具体元素,实现抽象元素所定义的接受操作接口
//家,访问者回家吃饭
class Homn extends Place{
public $name; function __construct($name){
$this->name = $name;
} function acceptVisitor(Visitor $visitor){
$visitor->eat($this);
}
} //公司,访问者来公司上班
class Company extends Place{
public $name; function __construct($name){
$this->name = $name;
} function acceptVisitor(Visitor $visitor){
$visitor->work($this);
}
} //树形结构对象,即元素集合
class ObjectStruction{
private $places = array(); //增加元素
function addPlace(Place $place){
$this->places[] = $place;
}
//去除元素
function removePlace(Place $place){
$key = array_search($place, $this->places);
if($key !== false){
unset($this->places[$key]);
}
}
//元素集合所有元素接受访问
function allAccept(Visitor $visitor) {
foreach ($this->places as $place)
{
$place->acceptVisitor($visitor);
}
}
} //测试
$objectStruction = new ObjectStruction();
$home = new Homn("家");
$objectStruction->addPlace($home);
$company = new Company("公司");
$objectStruction->addPlace($company); $visitor = new ConcreteVisitor();
$objectStruction->allAccept($visitor); ?>

访问者模式和php实现的更多相关文章

  1. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  2. 访问者模式(visitorpattern)

    /** * 访问者模式 * @author TMAC-J * 在客户端和元素之间添加一个访问者 * 当你需要添加一些和元素关系不大的需求时,可以直接放在访问者里面 * 或者是元素之间有一些公共的代码块 ...

  3. C#设计模式-访问者模式

    一. 访问者(Vistor)模式 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结 ...

  4. C#设计模式系列:访问者模式(Visitor)

    1.访问者模式简介 1.1>.定义 作用于某个对象群中各个对象的操作,可以使在不改变对象本身的情况下,定义作用于对象的新操作. 1.2>.使用频率   低 2.访问者模式结构 2.1> ...

  5. php实现设计模式之 访问者模式

    <?php /** * 访问者模式 * 封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. * 行为类模式 */ /** 抽象访问者:抽象类或 ...

  6. 十一个行为模式之访问者模式(Visitor Pattern)

    定义: 提供一个作用于某对象结构(通常是一个对象集合)的操作的接口,使得在添加新的操作或者在添加新的元素时,不需要修改原有系统,就可以对各个对象进行操作. 结构图: Visitor:抽象访问者类,对元 ...

  7. 访问者模式(Visitor Pattern)

    定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. Visitor 抽象访问者角色:为该对象结构中具体元素角色声明一个访问操作接口.该操作接口 ...

  8. JAVA 设计模式 访问者模式

    用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途

  9. 22.访问者模式(Vistor Pattern)

    using System; using System.Collections; namespace ConsoleApplication5 { /// <summary> /// 访问者模 ...

  10. 深入浅出设计模式——访问者模式(Visitor Pattern)

    模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...

随机推荐

  1. 基于Jenkins+Gitlab的自动化部署实战

    故事背景 一个中小型企业,是典型的互联网公司,当初期的时候可能运维只能标配到2~3人,此时随着公司的发展,项目会逐渐增多.前期部署项目可能都是手动的, 俗称“人肉部署”,这简直是无比的痛苦,不能忍受的 ...

  2. Anaconda tensorflow 安装笔记

    1.安装步骤: (1)Anaconda下载Anaconda 安装包可以到 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下载.ps:也可 ...

  3. html5 WebWorkers 防止浏览器假死

    在Web开发的时候经常会遇到浏览器不响应事件进入假死状态,甚至弹出“脚本运行时间过长“的提示框,如果出现这种情况说明你的脚本已经失控了. 一个浏览器至少存在三个线程:js引擎线程(处理js).GUI渲 ...

  4. CF 345A Mike and Frog

    题目 自己歪歪的做法WA了好多发. 原题中每一秒都相当于 $x1 = f1(x1)$ $x2 = f2(x2)$ 然后这是一个定义域和值域都在[0,m-1]的函数,显而易见其会形成一个环. 而且环长不 ...

  5. CodeForces 1110G. Tree-Tac-Toe

    题目简述:给定$n$个节点的树,其中一些节点被染成了白色(其余节点未染色).黑白双方博弈,白先动.轮到黑(白)方时,选择树上的一个未染色的节点并将其染成黑(白)色.率先达成三连色(即存在三个节点$a, ...

  6. 2-1Java简介

    java程序执行流程 java平台:

  7. Java的多线程创建方法

    1. 直接使用Thread来创建 package com.test.tt; public class ThreadEx extends Thread{ private int j; public vo ...

  8. Weekly Contest 78-------->808. Soup Servings

    There are two types of soup: type A and type B. Initially we have N ml of each type of soup. There a ...

  9. POJ3715【二分匹配-增广】

    题意: N个人,有两种人,M对亲密关系,问最少删除几个人达到没有亲密关系. 思路: 最大匹配 = 最小独立集,删掉该人对最大匹配数的影响,如果没有影响,删不删都无所谓,如果有影响贼删除: 类似HDU1 ...

  10. lightoj 1088【树状数组+离散化】

    题意: 给你n个数,然后给你q个区间,然后问你这n个数有多少个在这个区间上: 思路: 树状数组搞搞,但是注意到数的范围很大,所以先离散化一下. 初始化初始化!!!卧槽,wa的我好郁闷... #incl ...