所屬:行為型模式,常用設計模式之一
學習資料:
- 《大話設計模式》程傑
分享一篇關於策略模式講的很好的文章,大家可以參考一下:
https://www.cnblogs.com/qixuejia/p/4370270.html
策略模式就是用來封裝算法的,但在實踐中,我們發現可以用它來封裝幾乎任何類型的規則,只要在分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性。
超市促銷活動,分別有原價,八折,滿300減50,使用策略模式……,程序如何設計。
流程圖如下:
1. 抽象活動算法類
<?php /** * 抽象活動算法類 */ namespace strategy; abstract class StrategyAbstract { /** * 具體活動算法方法 * @return mixed */ public abstract function doAction($money); }
2. 具體算法產品類
<?php /** * 滿減算法產品類 */ namespace strategy; class ManJianStrategy extends StrategyAbstract { public function doAction($money) { echo '滿減算法:原價'. $money .'元'; } }
<?php /** * 打折算法產品類 */ namespace strategy; class DaZheStrategy extends StrategyAbstract { /** * 具體算法實現 * @param $money * @return mixed|void */ public function doAction($money) { echo '打折算法:原價'. $money .'元'; } }
3. 策略工廠類
<?php /** * 策略工廠類 */ namespace strategy; class StrategyFind { private $strategy_mode; /** * 初始時,傳入具體的策略對象 * @param $mode */ public function __construct($mode) { $this->strategy_mode = $mode; } /** * 執行打折算法 * @param $money */ public function get($money) { $this->strategy_mode->doAction($money); } }
入口文件
<?php namespace strategy; include '../autoload.php'; // 滿減折算 $mode1 = new StrategyFind(new ManJianStrategy()); $mode1->get(100); echo '<br>'; // 滿減活動 $mode2= new StrategyFind(new DaZheStrategy()); $mode2->get(100);
GitHub源碼地址:https://github.com/xiaobaoword/design_pattern/tree/master
策略模式就是使用封裝一個公共抽象算法,每個算法(比如,打折算法,滿減算法)實現這個接口,然后搞個策略工廠類來調用這些算法。
