设计模式之PHP项目应用——策略模式设计自动驾驶系统
Posted 程序员大宝(coder-dabao)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之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)设计模式之PHP项目应用(23种设计模式目录):http://blog.csdn.net/clevercode/article/details/45741843(目录持续更新,关注请收藏)。
4)博客专栏地址(设计模式之PHP项目应用):http://blog.csdn.net/column/details/phpusedesignpattern.html(博客持续增加,关注请收藏)。
5)欢迎大家关注我博客更多的精彩内容:http://blog.csdn.net/CleverCode。
技术交流
CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!
以上是关于设计模式之PHP项目应用——策略模式设计自动驾驶系统的主要内容,如果未能解决你的问题,请参考以下文章