极简设计模式-策略模式

策略模式(Strategy Pattern)

定义

定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)

设计的原则和思想

  1. 解耦策略的定义、创建和使用这三部分。
  2. 不变部分是算法本身,变化的部分是算法的调用。
  3. 核心思想是动态确定算法(变化)。

一句话概括设计模式

相同的接口,相同的方法,不同的策略。

结构中包含的角色

  1. Strategy(抽象策略类)
  2. ConcreteStrategy(具体策略类)
  3. Context(环境类)

最小可表达代码

// 抽象策略类
abstract class AbstractStrategy
{  
    public abstract function algorithm();
}

// 具体策略类
class ConcreteStrategy extends AbstractStrategy
{  
    public function algorithm()
    {
        echo "具体算法";
    }
}

// 环境类
class Context
{
    private $strategy;

    public function __construct(AbstractStrategy $strategy)
    {
        $this->strategy = $strategy;
    }

    public function algorithm()
    {
        $this->strategy->algorithm();
    }
}

$context = new Context(new ConcreteStrategy());
$context->algorithm();

优点

  1. 可以自由切换算法。
  2. 避免了多重条件判断。
  3. 算法单独提取到策略类中,提供了一种算法的复用机制。

缺点

  1. 因为需要选择合适的策略,客户端需要知道所有的策略算法。
  2. 任何的变化都将导致系统要增加一个新的具体策略类。
  3. 客户端每次只能使用一个策略类。

何时使用

  1. 需要动态地切换不同算法。
  2. 一个对象有很多的行为,将这些行为转移到相应的具体策略类可以避免维护多重条件语句。

实际应用场景

  1. 出行是骑自行车, 坐汽车还是走路。
  2. 一条鱼可以清蒸、红烧、炭烤等。
  3. 处理订单是同步还是异步。
  4. 日志记录到数据库,文件还是缓存。

注意

  1. 算法很少发生改变就没有必要使用这个模式了,使用会让程序更复杂。
  2. 如果策略多余4个,那么需要使用多个设计模式混合了来解决策略类膨胀的问题了。

策略的定义、创建和使用

策略的定义

一个策略接口和一组实现这个接口的策略类。

策略的创建

为了封装创建逻辑,可以把根据 type 创建策略的逻辑抽离出来,放到工厂类中。

策略的使用

运行时动态确定使用哪种策略,这也是策略模式最典型的应用场景。
本作品采用《CC 协议》,转载必须注明作者和本文链接
Long2Ge
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!