访问者(Visitor)模式
是一种复杂的行为型模式,从代码结构就可以清楚,主要包含访问者和被访问者。
百度定义:表示一个作用于某对象结构中的各元素的操作。使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
场景举例(代码如下):
所涉及的对象有:
抽象访问者(Visitor)
具体访问者 兵器类等(Weapon)
抽象元素类 英雄类(hero)
具体元素类 刘备,张飞等(LiuBei,ZhangFei)
对象结构类 (ObjectStruct)
<?php
header("Content-Type:text/html;charset=utf-8");
//------------------------访问者模式--------------------
require_once "Visitor.php";
$os = new ObjectStruct();
// 将英雄刘备添加到到对象结构里面
$os->Add(new LiuBei());
// 将英雄张飞添加到到对象结构里面
$os->Add(new ZhangFei());
// 实例化武器
$weapon = new Weapon();
// 显示
$os->Display($weapon);
<?php
echo "<pre>";
//抽象访问者
abstract class Visitor
{
/**
* 武器名
* @var string
*/
protected $weapon_name;
/**
* 抽象访问刘备武器方法
* @access public
* @param object $hero 英雄名
*/
public abstract function visitLiuBe(LiuBei $hero);
/**
* 抽象访问张飞武器方法
* @access public
* @param object $hero 英雄名
*/
public abstract function visitZhangFei(ZhangFei $hero);
}
// 具体访问者
class Weapon extends Visitor
{
/**
* 构造方法
* @access public
*/
public function __construct()
{
$this->weapon_name="兵器";
}
/**
* 具体访问刘备武器方法
* @access public
* @param object $hero 英雄名
*/
public function visitLiuBe(LiuBei $hero)
{
echo "{$hero->hero_name}的{$this->weapon_name}是:雌雄双剑。<br/>";
}
/**
* 具体访问张飞武器方法
* @access public
* @param object $hero 英雄名
*/
public function visitZhangFei(ZhangFei $hero)
{
echo "{$hero->hero_name}的{$this->weapon_name}是:丈八蛇矛。<br/>";
}
}
//抽象元素类
abstract class Hero
{
/**
* 英雄名
* @var string
*/
public $hero_name;
/**
* 具体访问张飞武器方法
* @access public
* @param object $visitor 访问对象
*/
public abstract function Accept(Visitor $visitor);
}
// 具体元素类
class LiuBei extends Hero
{
/**
* 构造方法 初始化具体英雄
* @access public
*/
function __construct()
{
$this->hero_name="刘备";
}
/**
* 具体元素的执行方法
* @access public
* @param object $visitor 访问对象
*/
public function Accept(Visitor $visitor)
{
$visitor->visitLiuBe($this);
}
}
// 具体元素类
class ZhangFei extends Hero
{
/**
* 构造方法 初始化具体英雄
* @access public
*/
public function __construct()
{
$this->hero_name="张飞";
}
/**
* 具体元素的执行方法
* @access public
* @param object $visitor 访问对象
*/
public function Accept(Visitor $visitor)
{
$visitor->visitZhangFei($this);
}
}
//对象结构类
class ObjectStruct
{
/**
* 对象结构一个元素集合
* @var array
*/
private $heros=array();
/**
* 对象结构添加方法
* @access public
* @param object $hero 英雄
*/
public function Add(Hero $hero)
{
array_push($this->heros,$hero);
}
/**
* 遍历显示
* @access public
* @param object $visitor 访问对象
*/
public function Display(Visitor $visitor)
{
foreach ($this->heros as $v)
{
$v->Accept($visitor);
}
}
}
输出结果:
刘备的兵器是:雌雄双剑。 张飞的兵器是:丈八蛇矛。