php设计模式 Visitor 访问者模式


Posted in PHP onJune 28, 2011
<?php 
/** 
* 访问者模式 
* 
* 表示一个作用于某对象结构中的各元素的操作,可以在不改变各元素的类的前提下定义作用于这些元素的新操作 
* 
*/ 
abstract class Visitor 
{ 
abstract public function visitCroncreteElementA($element); 
abstract public function visitCroncreteElementB($element); 
} 
class ConcreteVisitor1 extends Visitor 
{ 
public function visitCroncreteElementA($element) 
{ 
echo get_class($element)." visit 1A<br/>"; 
} 
public function visitCroncreteElementB($element) 
{ 
echo get_class($element)." visit 1B<br/>"; 
} 
} 
class ConcreteVisitor2 extends Visitor 
{ 
public function visitCroncreteElementA($element) 
{ 
echo get_class($element)." visit 2A<br/>"; 
} 
public function visitCroncreteElementB($element) 
{ 
echo get_class($element)." visit 2B<br/>"; 
} 
} 
abstract class Element 
{ 
abstract public function accept($visitor); 
} 
class ConcreteElementA extends Element 
{ 
public function accept($visitor) 
{ 
$visitor->visitCroncreteElementA($this); 
} 
} 
class ConcreteElementB extends Element 
{ 
public function accept($visitor) 
{ 
$visitor->visitCroncreteElementB($this); 
} 
} 
class ObjectStructure 
{ 
private $_elements = array(); 
public function attach($element) 
{ 
$this->_elements[] = $element; 
} 
public function detach($element) 
{ 
if($key = array_search($element,$this->_elements) !== false) unset($this->_elements[$key]); 
} 
public function accept($visitor) 
{ 
foreach($this->_elements as $element) 
{ 
$element->accept($visitor); 
} 
} 
} 
// 
$objOS = new ObjectStructure(); 
$objOS->attach(new ConcreteElementA()); 
$objOS->attach(new ConcreteElementB()); 
$objCV1 = new ConcreteVisitor1(); 
$objCV2 = new ConcreteVisitor2(); 
$objOS->accept($objCV1); 
$objOS->accept($objCV2);
PHP 相关文章推荐
Php做的端口嗅探器--可以指定网站和端口
Oct 09 PHP
php横向重复区域显示二法
Sep 25 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
Aug 21 PHP
php实现的树形结构数据存取类实例
Nov 29 PHP
PHP进程同步代码实例
Feb 12 PHP
PHP开发框架laravel安装与配置教程
Mar 13 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 PHP
php+ajax无刷新分页实例详解
Dec 07 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
PHP PDOStatement::bindColumn讲解
Jan 30 PHP
浅谈php使用curl模拟多线程发送请求
Mar 08 PHP
PHP常用的类封装小结【4个工具类】
Jun 28 PHP
php懒人函数 自动添加数据
Jun 28 #PHP
php中比较简单的导入phpmyadmin生成的sql文件的方法
Jun 28 #PHP
从康盛产品(discuz)提取出来的模板类
Jun 28 #PHP
php skymvc 一款轻量、简单的php
Jun 28 #PHP
关于php mvc开发模式的感想
Jun 28 #PHP
yii框架源码分析之创建controller代码
Jun 28 #PHP
关于PHP中Object对象的笔记分享
Jun 28 #PHP
You might like
用PHP读取flv文件的播放时间长度
2009/09/03 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
php实现微信支付之退款功能
2018/05/30 PHP
初学Javascript的一些总结
2008/11/03 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
jQuery超简单选项卡完整实例
2015/09/26 Javascript
js中对函数设置默认参数值的3种方法
2015/10/23 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
2016/12/02 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
2017/01/22 Javascript
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
小程序实现五星点评效果
2018/11/03 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
python实现内存监控系统
2021/03/07 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
python实现飞机大战小游戏
2019/11/08 Python
Django中提示消息messages的设置方式
2019/11/15 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
美国二手奢侈品寄售网站:TheRealReal
2016/10/29 全球购物
一个SQL面试题
2014/08/21 面试题
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
企业文化建设实施方案
2014/03/22 职场文书
2014年三万活动总结
2014/04/26 职场文书
城管综合整治方案
2014/05/01 职场文书
体育口号大全
2014/06/18 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
结婚保证书
2015/01/16 职场文书
任命书怎么写
2015/03/02 职场文书
2019暑假学生安全口号
2019/06/27 职场文书
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers