分享一篇关于策略模式讲的很好的文章,大家可以参考一下:https://www.cnblogs.com/qixuejia/p/4370270.html (非PHP语言)
https://blog.csdn.net/Firehotest/article/details/52722734 策略模式和适配器模式
模式概述
策略模式 就是封装一个公共抽象算法,每个算法(比如,打折算法,满减算法)实现这个接口,然后搞个策略工厂类来调用这些算法。
举个例子
超市促销活动,分别有原价,八折,满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);
}
}
4. 入口文件
<?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
策略模式和适配器模式的区别
策略模式
定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化; 使用的关键点是面对对象、面向接口编程。
实现步骤:
1、定义抽象策略类
2、实现具体策略类
3、定义环境类
适配器模式
是在想使用一个已经存在的类,但是他的接口并不符合要求,因为在编码过程中要遵循对扩展开放,对修改关闭的原则,所以不能对原有的类进行修改,这时便需要使用适配器模式,将原有的类适配成自己需要的形式。有类适配器和对象适配器两种适配器。
实现步骤:
1、确定目标接口
2、确定被适配者
3、创建类适配器
4、创建对象适配器、
策略模式优于适配器模式:
1、首先很大程度上简化了我们的代码。
2、降低了我们程序代码的耦合度,而低耦合正是面向对象的重要优点。