組合模式

<?php
abstract class Lesson{
    private $duration;
    private $costStrategy;

    function __construct( $duration, CostStrategy $strategy)
    {
        $this->duration = $duration;
        $this->costStrategy = $strategy;
    }

    function cost()
    {
        return $this->costStrategy->cost( $this );
    }

    function chargeType()
    {
        return $this->costStrategy->chargeType( $this );
    }

    function getDuration()
    {
        return $this->duration;
    }
}

class Lecture extends Lesson{
    //lecrure 特定的方法
}

class Seminar extends Lesson{
    //seminar 特定的方法
}

abstract class CostStrategy{
    abstract function cost( Lesson $lesson);
    abstract function chargeType();
}

//如下有不一樣的計費方式

class TimedCostStrategy extends CostStrategy{
  //計費方式一
function cost( Lesson $lesson) { return $lesson->getDuration()*5; } function chargeType() { return "hourly rate"; } } class FixedCostStrategy extends CostStrategy{
  //計費方式二
function cost( Lesson $lesson) { return 30; } function chargeType() { return "fixed rate"; } }

$lessons[] = new Seminar(4, new TimedCostStrategy() );
$lessons[] = new Lecture(4, new FixedCostStrategy() );
foreach ($lessons as $lesson) {
print " lesson charge {$lesson->cost}";
print " Charge type: {$lesson->chargeType()}\n";
}php



經過傳遞不一樣的CostStrategy對象,來改變Lesson對象的計算費用方式less

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息