首页 > 其他分享 >【设计模式】策略模式

【设计模式】策略模式

时间:2024-05-06 21:56:02浏览次数:30  
标签:上下文 策略 模式 Strategy strategy 接口 context 设计模式

一、介绍

策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。

这里列举两个例子来说明下策略模式的使用场景:

(1)根据会员等级来计算折扣力度。不同等级拥有不同的折扣力度,这样就可以根据策略模式去灵活的计算,就算之后又新增了几个等级的会员,也不用修改原代码,只需新增对应会员的具体策略就可以了。

(2)电子商务平台的支付,可以根据用户的选择来使用不同的支付策略(支付宝、银行卡、微信)。同理,之后新增其他支付类型时也只需要新增具体策略无需修改原代码。

 

二、优缺点:

优点:

  • 可以将代码的实现和使用分离开来,增加了灵活性
  • 符合开闭原则,无需对上下文进行修改就能够引入新的策略。
  • 客户端代码可以根据需要在运行时切换策略,无需修改现有代码。

缺点:

  • 如果具体的策略类过多会导致类的数量增加,进而维护成本增加。
  • 客户端必须知晓各策略间的不同才能选择合适的策略。

 

三、核心结构

1、上下文(Context):上下文类负责维护对策略对象的引用,并在运行时切换策略。上下文类通常具有一个方法,用于执行当前策略。

2、策略接口(Strategy):通常由一个接口或抽象类实现,定义了具体策略类所需的接口。

3、具体策略类(Concrete Strategy):实现了上下文所用算法的各种不同变体。

 

四、代码实现

1、上下文(Context):上下文类负责维护对策略对象的引用,并在运行时切换策略。上下文类通常具有一个方法,用于执行当前策略。

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/4/7
 */

namespace app\admin\service\strategy;

/**
 * 策略模式的上下文
 */
class Context
{
    private Strategy $strategy;

    /**
     * 构造函数
     * Context constructor.
     * @param Strategy $strategy
     */
    public function __construct(Strategy $strategy)
    {
        $this->strategy = $strategy;
    }

    /**
     * 设置策略对象
     * @param Strategy $strategy
     * @author fengzi
     * @date   2023-05-23 17:02
     */
    public function setStrategy(Strategy $strategy)
    {
        $this->strategy = $strategy;
    }

    /**
     * 委托策略对象实现具体操作
     * @param array $params
     * @return mixed
     * @author fengzi
     * @date   2023-05-23 17:06
     */
    public function doSomeLogic(array $params=[])
    {
        return $this->strategy->doAlgorithm($params);
    }

}

 

2、策略接口(Strategy):通常由一个接口或抽象类实现,定义了具体策略类所需的接口。

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/4/7
 */

namespace app\admin\service\strategy;

/**
 * 策略接口
 */
interface Strategy
{
    /**
     * 实际计算的方法
     * @param array $params
     * @author fengzi
     * @date   2023-05-24 16:47
     */
    public function doAlgorithm(array $params=[]);
}

 

3、具体策略类(Concrete Strategy):实现了上下文所用算法的各种不同变体。

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/4/7
 */

namespace app\admin\service\strategy;

/**
 * 支付宝支付的具体策略
 */
class AlipayStrategy implements Strategy
{

    public function doAlgorithm(array $params = [])
    {
        // TODO: Implement doAlgorithm() method.

        echo '支付宝支付'.$params['price'].'元';
    }
}
<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/4/7
 */

namespace app\admin\service\strategy;

/**
 * 微信支付的具体策略
 */
class WeChatPayStrategy implements Strategy
{

    public function doAlgorithm(array $params = [])
    {
        // TODO: Implement doAlgorithm() method.

        echo '微信支付'.$params['price'].'元';
    }
}

 

4、客户端调用及结果展示

<?php
/**
 * Created by PhpStorm
 * Author: fengzi
 * Date: 2024/4/7
 */

namespace app\admin\controller\strategy;

use app\admin\service\strategy\AlipayStrategy;
use app\admin\service\strategy\Context;
use app\admin\service\strategy\WeChatPayStrategy;

/**
 * 策略模式
 */
class StrategyController
{
    /**
     * 客户端使用策略模式
     * @return void
     * @Author: fengzi
     * @Date: 2024/4/7
     */
    public function index()
    {
        $date = [
            'price' => 100.00,
        ];
        $context = new Context(new AlipayStrategy());
        $context->doSomeLogic($date);
        echo PHP_EOL;
        $context->setStrategy(new WeChatPayStrategy());
        $context->doSomeLogic($date);
    }
}

 

标签:上下文,策略,模式,Strategy,strategy,接口,context,设计模式
From: https://www.cnblogs.com/mklblog/p/18112534

相关文章

  • openGauss btree-索引故障情况下应对策略
    btree索引故障情况下应对策略问题现象偶发索引丢失错误,报错如下。ERROR:index'xxxx_index'containsunexpectedzeropage或ERROR:index'pg_xxxx_index'containsunexpectedzeropage或ERROR:compresseddataiscorrupt原因分析该类错误是因为索引发生故障导......
  • 路由跳转、相关api、路由守卫、路由两种工作模式
    【router基本使用(路由跳转,携带数据)】#######跳转#######-js跳转this.$router.push(路径)this.$router.push(对象)-this.$router.push({name:'路由别名'})-this.$router.push({path:'路径'})-组件跳转......
  • 设计模式笔记
    简单记一下方便需要的时候看设计模式原则总原则:开闭原则--对扩展开放,对修改关闭单一职责里氏替换--任何基类可以出现的地方,子类一定可以出现依赖倒置--依赖于抽象而不依赖于具体接口隔离--类间的依赖关系应该建立在最小的接口上最少知道--只和朋友交谈首......
  • 探索企业级项目管理的最优策略
    企业的项目管理应该采取综合性的方式,结合多种工具和方法来确保项目的成功。zz-plan甘特图是其中一种非常有用的工具,它可以帮助项目经理和团队成员可视化地展示项目的时间线和进度。以下是采取合适项目管理方式时需要考虑的几个关键点,结合甘特图的使用: 项目规划:在项目启动阶......
  • 数据仓库 vs 数据湖 vs 湖仓一体:如何基于自身数据策略,选择最合适的数据管理方案?
    在信息化浪潮席卷全球的今天,数据已经成为企业决策和发展的重要驱动力。无论是电商平台的用户行为分析,还是金融领域的风险预测,亦或是物联网设备的海量数据处理,都离不开高效、灵活的数据存储和处理方式。在这样的背景下,各种数据存储和处理技术应运而生,它们各自以其独特的方式在数据......
  • 高性能摩托车灯降压恒流ic全亮/半亮/循环模式短路保护AP5126
    AP5126是一款PWM工作模式,高效率、外围简单、内置功率管,适用于12-80V输入的高精度降压LED恒流驱动芯片。输出最大功率可达15W,最大电流1.2A。AP5126可实现全亮/半亮功能切换,通过MODE切换:全亮/半亮/循环模式。AP5126工作频率固定在140KHZ,同时内置抖频电路,可以降低对......
  • AP5127 是一款 PWM 工作模式,高效率、外围简单、内置功率管
    AP5121是一款外围电路简单的多功能平均电流型LED恒流驱动器,适用于宽电压范围的非隔离式大功率恒流LED驱动领域。芯片PWM端口支持超小占空比的PWM调光,可响应最小60ns脉宽。芯片采用我司专利算法,为客户提供最佳解决方案,最大限度地发挥灯具优势,以实现景观舞台灯高辉的调......
  • ubuntu 桥接模式无法上网解决
    ubuntu安装,根据个人的选择来配置网络信息,以下是vmare配置桥接模式时ubuntu无法上网的处理方式:1.vmare-》虚拟机-》设置,选中桥接模式(复制物理状态可以不勾选)2. vmare-》编辑-》虚拟网络编辑器,选中更改设置 2. 选中VMnet0网卡,该网卡选中电脑目前在用的网卡名称;(注意......
  • NVIDIA机器人仿真环境 —— NVIDIA Isaac Sim 的headless模式/无头模式 —— 非桌面模
    相关:https://developer.nvidia.com/isaac-sim可视化模式,也就是在桌面系统上直接安装软件,具体地址:https://developer.nvidia.com/isaac-sim无头模式则是使用docker安装,该种情况下不使用可视化界面,所有操作均在docker容器内,地址:https://catalog.ngc.nvidia.com/orgs/nvid......
  • 在 Apple silicon Mac 上 DFU 模式修复或恢复 macOS 固件 (2024年5月更新)
    在ApplesiliconMac上DFU模式修复或恢复macOS固件搭载Apple芯片的Mac电脑DFU模式全新安装macOSSonoma请访问原文链接:在ApplesiliconMac上DFU模式修复或恢复macOS固件,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgMaccomputerswithApple......