访问者设计模式

<?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());
//当需要的对象包含以标准方式应用于某个对象的算法时,最佳的做法是使用访问者设计模式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章