23种设计模式-策略模式


23种设计模式-策略模式

概述

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

结构

策略模式主要角色如下:

  • 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现,此角色给出所有的具体策略类所需的接口。
  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

实现


/**
 * 第三方支付服务接口
 * 抽象策略类
 */
interface Pay
{
    public function getPayParams();

    public function callback();
}

/**
 * 具体策略类
 */
class Join implements Pay
{
    public function getPayParams()
    {
        return '聚合支付订单参数';
    }

    public function callback()
    {
        return '执行聚合支付回调';
    }
}

/**
 * 具体策略类
 */
class Wechat implements Pay
{
    public function getPayParams()
    {
        return '微信支付订单参数';
    }

    public function callback()
    {
        return '执行微信支付回调';
    }
}

class PayContext
{
    public function __construct(public Pay $pay)
    {
    }

    public function getPayParams()
    {
        return $this->pay->getPayParams();
    }

    public function callback()
    {
        return $this->pay->callback();
    }
}

// 测试
$joinPay = new PayContext(new Join());
$joinPay->getPayParams();
$joinPay->callback();

优缺点

优点

  • 策略类之间可以自由切换
  • 易于扩展,增加一个新的策略只需要添加一个具体的策略类即可
  • 避免使用多重条件选择语句

    缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
  • 策略模式将造成产生很多策略类

使用场景

  • 一个系统需要动态的在几种算法中选择一种时,可将每个算法封装到具体的策略类中。
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。
  • 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。
  • 系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。

文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
23种设计模式-命令模式 23种设计模式-命令模式
23种设计模式-命令模式概述将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。 结构命令模式包含以下角色: 抽象命令类(Command)
下一篇 
23种设计模式-模版方法模式 23种设计模式-模版方法模式
23种设计模式-模版方法模式概述定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下,重定义该算法的某些特定步骤。 结构模版方法模式包含以下主要角色: 抽象类:负责给出一个算法的轮廓和骨架,它由一
  目录