設計模式之PHP專案應用——策略模式設計自動駕駛系統
阿新 • • 發佈:2019-02-13
1 前言
關於策略模式的定義,模式組成,模式核心思想,模式架構圖,程式架構等基礎知識介紹。請先參考我的另外一篇部落格《(三)設計模式之PHP專案應用(策略模式:商場收銀系統)》:http://blog.csdn.net/clevercode/article/details/45722661。2 專案應用
2.1 需求說明
某公司是福特和本田公司的金牌合作伙伴,現要求開發一套自動駕駛系統,只要汽車上安裝該系統就可以實現無人駕駛,只用實現啟動,轉彎,停止功能即可。該系統可以在福特和本田車上使用。這兩個品牌的汽車使用該系統就能實現自動駕駛,並且系統能夠很好的移植到其他汽車上(來之《網路》)2.2 需求分析
2.3 設計架構圖
2.4 程式原始碼下載
http://download.csdn.net/detail/clevercode/87003492.5 程式說明
1)strategy.php
<?php /** * strategy.php * * 策略類 * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/5/14, by CleverCode, Create * */ // 定義自動駕駛汽車能夠實現的操作 interface ICar{ // 啟動 public function run(); // 停止 public function stop(); // 轉彎 public function turn(); } // 本田汽車 class HondaCar implements ICar{ /** * 啟動 * * @return void */ public function run(){ echo "本田車啟動了!\r\n"; } /** * 轉彎 * * @return void */ public function turn(){ echo "本田車拐彎了!\r\n"; } /** * 停止 * * @return void */ public function stop(){ echo "本田車停止了!\r\n"; } } // 福特汽車 class FordCar implements ICar{ /** * 啟動 * * @return void */ public function run(){ echo "福特車啟動了!\r\n"; } /** * 轉彎 * * @return void */ public function turn(){ echo "福特車拐彎了!\r\n"; } /** * 停止 * * @return void */ public function stop(){ echo "福特車停止了!\r\n"; } } // 吉普汽車 class JeepCar implements ICar{ /** * 啟動 * * @return void */ public function run(){ echo "吉普車啟動了!\r\n"; } /** * 轉彎 * * @return void */ public function turn(){ echo "吉普車拐彎了!\r\n"; } /** * 停止 * * @return void */ public function stop(){ echo "吉普車停止了!\r\n"; } }
2)strategyPattern.php
<?php /** * strategyPattern.php * * 設計模式:策略模式 * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/5/14, by CleverCode, Create * */ // 載入所有的策略 include_once ('strategy.php'); // 建立一個環境類,根據不同的需求呼叫不同策略 class AutoSystem{ // 策略 private $_car = null; /** * 建構函式 * * @param string $type 型別 * @return void */ public function __construct($type = null){ if (!isset($type)) { return; } $this->setCar($type); } /** * 設定策略(簡單工廠與策略模式配合使用) * * @param string $type 型別 * @return void */ public function setCar($type){ $cs = null; switch ($type) { // 本田汽車 case 'Honda' : $cs = new HondaCar(); break; // 福特汽車 case 'Ford' : $cs = new FordCar(); break; // 吉普汽車 case 'Jeep' : $cs = new JeepCar(); break; } $this->_car = $cs; } /** * 啟動汽車 * * @return void */ public function runCar(){ $this->_car->run(); } /** * 轉彎汽車 * * @return void */ public function turnCar(){ $this->_car->turn(); } /** * 停止汽車 * * @return void */ public function stopCar(){ $this->_car->stop(); } } /* * 客戶端類 * 讓客戶端和業務邏輯儘可能的分離,降低客戶端和業務邏輯演算法的耦合, * 使業務邏輯的演算法更具有可移植性 */ class Client{ public function main(){ $autoSystem = new AutoSystem(); // 選擇汽車應用自動駕駛系統 $autoSystem->setCar('Honda'); $autoSystem->runCar(); $autoSystem->turnCar(); $autoSystem->stopCar(); $autoSystem->setCar('Ford'); $autoSystem->runCar(); $autoSystem->turnCar(); $autoSystem->stopCar(); $autoSystem->setCar('Jeep'); $autoSystem->runCar(); $autoSystem->turnCar(); $autoSystem->stopCar(); } } /** * 程式入口 */ function start(){ $client = new Client(); $client->main(); } start(); ?>
3 總結
1) 在strategy.php與strategyPattern.php中。如果需要擴充套件多的汽車應用自動駕駛系統,只需要繼承ICar介面實現更多的類,這裡與簡單工廠模式結合使用。是程式更清晰。2) 這也是典型的依賴倒置原則的體現。現在AutoSystem系統依賴於ICar 這個抽象,而與具體的實現細節HondaCar、FordCar、JeepCar無關,所以實現細節的變化不會影響AutoSystem。對於實現細節只要實現ICar 即可,即實現細節依賴於ICar 抽象。
3) 依賴倒置原則:A.高層次的模組不應該依賴於低層次的模組,他們都應該依賴於抽象。B.抽象不應該依賴於具體,具體應該依賴於抽象。
1)原創作品,出自"CleverCode的部落格",轉載時請務必註明以下原創地址,否則追究版權法律責任。