策略模式針對一組算法,將每個算法封裝到具備共同接口的獨立的類中,此模式讓算法的變化獨立於使用算法的客戶。從而讓程序結構更靈活,具備更好的擴展性和維護性php
抽象策略角色:定義全部支持的算法的公共接口。一般是以一個接口或抽象來實現算法
具體策略角色:實現接口的具體算法設計模式
環境角色:持有抽象策略角色的引用this
實際場景中,爲了不在代碼的重複,這裏引用鴨子游戲的列子,參考文獻: 《head first 設計模式》。
鴨子游戲中有個超類Durk,各自鴨子子類繼承超類,在超類中有個fly方法,然而鴨子子類中會存在橡皮鴨子類,而橡皮鴨子是不會fly的,能夠使用重載的方法,把橡皮鴨的fly()方法設置爲空,可是當不會飛的鴨子變多的時候,代碼重複就會愈來愈多,這個時候咱們就能夠用到策略模式來實現。spa
<?php //定義一個抽象類 abstract class FlyBehavior{ public function fly(){} } //抽象類的具體決策實現 class FlyWithWings extends FlyBehavior{ public function fly(){ echo "I can fly with wings"; } } //抽象類的具體決策實現 class FlyWithNo extends FlyBehavior{ public function fly(){ echo "i can not fly"; } } //引用抽象類 class Duck{ private $_flyBehavior; public function __construct($object) { $this->_flyBehavior = $object; } public function fly(){ return $this->_flyBehavior->fly(); } } $duck = new Duck(new FlyWithWings()); echo $duck->fly();
在實際場景中,若是應用須要變化之處,把他們獨立出來,單獨封裝,封裝好接口後,經過指定的接口實現類進行算法的變化設計