【设计模式】——策略模式

策略模式的思想

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为。策略模式的核心思想是将不同的算法封装成独立的策略类,并使这些策略类可以互相替换,从而使客户端代码不依赖于具体的算法,增加了代码的灵活性和可维护性

策略模式的组成部份

  1. 策略接口(Strategy Interface) :定义一组算法的通用接口,通常包含一个或多个方法,这些方法表示不同策略所执行的操作。

  2. 具体策略类(Concrete Strategies) :实现策略接口,提供具体的算法实现。每个具体策略类代表一种算法或策略的具体实现。

  3. 环境类(Context) :持有一个策略对象的引用,并提供方法来执行算法。环境类通常包含一个设置策略的方法,以及使用策略来执行操作的方法

策略模式的优点

  • 通过动态切换策略对象,可以在运行时适应不同的需求,提高了代码的灵活性
  • 策略模式有助于减少代码重复,因为多个算法可以共享相同的接口和通用行为
  • 可以轻松添加新的算法或策略,无需修改现有的客户端代码,符合开放封闭原则。
  • 提高了代码的可维护性,因为每个算法都有自己的类,易于理解和维护

例子:

  • 以支付为例,不同人进行的支付方式可能不同,定义一个策略类,并将pay接口定义为虚函数
  • 如果想要扩展支付方式,直接定义新的类,并继承策略类,重写pay函数即可
cpp 复制代码
#include <iostream>

// 策略接口
class PaymentStrategy {
public:
    virtual void pay(int amount) = 0;
};

// 具体策略类1:信用卡支付
class CreditCardPayment : public PaymentStrategy {
private:
    std::string cardNumber;
    std::string name;

public:
    CreditCardPayment(const std::string& cardNumber, const std::string& name)
        : cardNumber(cardNumber), name(name) {}

    void pay(int amount) override {
        std::cout << amount << " paid using credit card." << std::endl;
        // 具体的支付逻辑
    }
};

// 具体策略类2:PayPal支付
class PayPalPayment : public PaymentStrategy {
private:
    std::string email;

public:
    PayPalPayment(const std::string& email)
        : email(email) {}

    void pay(int amount) override {
        std::cout << amount << " paid using PayPal." << std::endl;
        // 具体的支付逻辑
    }
};

// 环境类
class ShoppingCart {
private:
    PaymentStrategy* paymentStrategy;

public:
    void setPaymentStrategy(PaymentStrategy* strategy) {
        paymentStrategy = strategy;
    }

    void checkout(int amount) {
        if (paymentStrategy) {
            paymentStrategy->pay(amount);
        } else {
            std::cout << "Please set a payment strategy before checking out." << std::endl;
        }
    }
};

int main() {
    // 创建环境对象
    ShoppingCart cart;

    // 设置具体策略
    cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9876-5432", "John Doe"));

    // 执行支付操作
    cart.checkout(100);

    // 切换策略
    cart.setPaymentStrategy(new PayPalPayment("john@example.com"));

    // 再次执行支付操作
    cart.checkout(50);

    return 0;
}
相关推荐
谎言西西里3 分钟前
LeetCode 热题100 --- 双指针专区
算法
leo__5203 小时前
基于两步成像算法的聚束模式SAR MATLAB实现
开发语言·算法·matlab
前端小白在前进3 小时前
力扣刷题:在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
某林2125 小时前
基于SLAM Toolbox的移动机器人激光建图算法原理与工程实现
stm32·嵌入式硬件·算法·slam
修炼地5 小时前
代码随想录算法训练营第四十三天 | 图论理论基础、深搜理论基础、卡码网98. 所有可达路径、797. 所有可能的路径、广搜理论基础
算法·深度优先·图论
iAkuya5 小时前
(leetcode)力扣100 23反转链表(迭代||递归)
算法·leetcode·链表
剪一朵云爱着5 小时前
PAT 1095 Cars on Campus
算法·pat考试
MicroTech20256 小时前
激光点云快速配准算法创新突破,MLGO微算法科技发布革命性点云配准算法技术
人工智能·科技·算法
Cathy Bryant6 小时前
傅里叶变换(一):简介
笔记·算法·数学建模·信息与通信·傅里叶分析
allan bull7 小时前
在节日中寻找平衡:圣诞的欢乐与传统节日的温情
人工智能·学习·算法·职场和发展·生活·求职招聘·节日