我对访问者模式的理解是,对于同一个对象或者数据源,由访问者决定这个对象的处理方式或者数据呈现模式。最简单的,对于同样销售数据,对销售者而言,它可能需要知道的是自己的销售多少商品,获得了多少钱,但对老板而言,它需要这份销售记录整理出,每种商品的增长趋势,以决定未来的销售策略。
代码如下:
interface IVistor{
public function visit(IData $dataObj);
}
class Boss implements IVistor{
public function visit(IData $dataObj){
$data = $dataObj->Data();
foreach($data as $val){
echo "<br>boss visit {$val}<br>";
}
}
}
class Manager implements IVistor{
public function visit(IData $dataObj){
$data = $dataObj->Data();
foreach($data as $val){
echo "<br>Manager visit {$val}<br>";
}
}
}
abstract class IData { //访问接收者(数据源)
public function accept(IVistor $visitor){
$visitor->visit($this); //重点,由点像策略
}
public abstract function Data();
}
class DayData extends IData{
public function Data(){
return ["1号数据", "2号数据", "3号数据", "4号数据"];
}
}
$Boss = new Boss();
$Manager = new Manager();
$Data = new DayData();
//同一份数据,不同的访问者,以不同的方式处理和呈现
$Data->accept($Boss);
$Data->accept($Manager);