#策略(Strategy)模式#定義抽象類別 Lessonabstract class Lesson{private $duration;private $coststrategy;#定義屬性public function __construct($duration , CostStrategy $strategy){ #執行個體化時,傳進來一個對象#用CostStrategy 類來處理 某個行為,而不用調用自身的方法來處理$this->duration =$duration;$this->coststrategy = $strategy;}public function cost(){return $this->coststrategy->cost($this); # ??? ??? ??? ??? ??? ??? ??? ??? ???}#不是用抽象類別的 abstract CostStrategy 類 中的方法 cost 來實現的,#從輸出的值看來 是用的 #TimedCostStrategy#FixedCostStrategy 中 的方法,所以# 在執行個體化對象時,用了 #TimedCostStrategy#FixedCostStrategy 中 的方法public function chargeType(){return $this->coststrategy->chargeType();}public function getDuration(){return $this->duration;}}abstract class CostStrategy{ #抽象類別是不能執行個體化的abstract function cost( Lesson $lesson); #傳入的參數是對象abstract function chargeType();}class TimedCostStrategy extends CostStrategy{public function cost(Lesson $lesson){return ($lesson->getDuration()*5); # 在Lesson 類中,getDuration 的傳回值是 return $this->duration;}public function chargeType(){return 'hourly rate!';}}class FixedCostStrategy extends CostStrategy{function cost(Lesson $lesson){return 30;#此處為調用如何方法,只是單純的返回一個值}function chargeType(){return 'fixed rate';}}#繼承類Lessonclass Lecture extends Lesson{}#繼承類Lesson class Seminar extends Lesson{}#執行個體化對象$lessons[] = new Seminar(4,new TimedCostStrategy()); #產生了一個TimeConsTrategy的一個對象 $lessons[]= new Lecture(4 , new FixedCostStrategy());#產生了一個FixedConsTrategy的一個對象#分別 調用TimeConsTrategy && FixedConsTrategy 中的方法 const() 和 chargeType(),在執行遍曆foreach ($lessons as $lesson) {# 遍曆輸出print "lesson charge {$lesson->cost()}==>>";print "Charge type: {$lesson->chargeType()}
";}
以上就介紹了php 策略模式的學習 --引自《深入php物件導向模式與實踐》,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。