<?php
/**
* 访问者双要素
* 1.元素
* 2.访问者
* 元素负责存储数据,提供接口访问
* 访问者通过元素暴露的接口获取信息
*/
abstract class Element{
public function accept(Visitor $visitor){
$visitor->visit($this);
}
}
interface Visitor{
public function visit(Element $element);
}
/**
* 以看电影为例子
*/
class xyy extends Element{
public $name = '喜洋洋';
}
class bxjg extends Element{
public $name = '变形金刚';
}
class jf extends Element{
public $name = '教父';
}
class movie {
public $ElementList = [];
public function add(Element $el){
array_push($this->ElementList,$el);
}
public function accept(Visitor $visitor){
foreach ($this->ElementList as $el){
$el->accept($visitor);
}
}
}
//小孩
class child implements Visitor{
public function visit($el){
if($el->name == '喜洋洋'){
echo '我是小孩子,能看'.$el->name.'<br/>';
}
}
}
//青年
class young implements Visitor{
public function visit($el){
if($el->name == '教父'){
echo '我是青年,能看'.$el->name.'<br/>';
}
}
}
//老年
class old implements Visitor{
public function visit($el){
if($el->name == '变形金刚'){
echo '我是老年人,能看'.$el->name.'<br/>';
}
}
}
/**
* 访问者模式优点:
* 1.容易增加访问者,完全符合开放闭合
* 2.将有关元素对象的访问集中到访问者中
* 缺点:
* 1.不容易增加元素,增加元素需要修改所有访问者
* 2.破坏封装,元素对象将自身暴露给访问者(visit($this))
*/
//创建电影
$movie = new movie();
$movie->add(new xyy());
$movie->add(new bxjg());
$movie->add(new jf());
//儿童走进电影院
$movie->accept(new child());
//少年走进电影院
$movie->accept(new young());
//老年人进入电影院
$movie->accept(new old());
访问者模式
最新推荐文章于 2024-01-19 10:25:31 发布