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/8700349


2.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的部落格",轉載時請務必註明以下原創地址,否則追究版權法律責任。