<?php
//访问者设计模式构造了包含某个算法的截然不同的对象,在父对象以标准方式使用这些对象时就会将该算法应用于父对象。
class CD{
public $band;
public $title;
public $price;
public function __construct($band, $title, $price){
$this->band = $band;
$this->title = $title;
$this->price = $price;
}
public function buy(){
echo 'a customer is buying'.PHP_EOL;
}
public function acceptVisitor($visitor){
$visitor->visitCD($this);
}
}
class CDVisitiorLogPurchase{
public function visitCD($cd){
$logline = "{$cd->title} by {$cd->band} was purchased for {$cd->price} ";
$logline .= 'at '.date('Y-m-d H:i:s').PHP_EOL;
echo $logline;
}
}
class CDVisitorPopulateDiscountList{
public function visitCD($cd){
if($cd->price < 10){
$this->_populateDiscountList($cd);
}
}
protected function _populateDiscountList($cd){
echo 'populateDiscountList was visited'.PHP_EOL;
}
}
$externalBand = 'TFBOYS';
$externalTitle = 'zuoshouyoushou';
$externalPrice = 7;
$cd = new CD($externalBand, $externalTitle, $externalPrice);
$cd->buy();
$cd->acceptVisitor(new CDVisitiorLogPurchase());
$cd->acceptVisitor(new CDVisitorPopulateDiscountList());
//当需要的对象包含以标准方式应用于某个对象的算法时,最佳的做法是使用访问者设计模式。