(四)设计模式之PHP项目应用(策略模式:自动驾驶系统)



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的博客",转载时请务必注明以下原创地址,否则追究版权法律责任。

2)原创地址http://blog.csdn.net/clevercode/article/details/45723773转载务必注明该地址)。

3)欢迎大家关注我博客更多的精彩内容:http://blog.csdn.net/CleverCode


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。