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


    策略模式的思想

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

    策略模式的组成部份

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

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

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

    策略模式的优点

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

    例子: 

    • 以支付为例,不同人进行的支付方式可能不同,定义一个策略类,并将pay接口定义为虚函数
    • 如果想要扩展支付方式,直接定义新的类,并继承策略类,重写pay函数即可
    1. #include
    2. // 策略接口
    3. class PaymentStrategy {
    4. public:
    5. virtual void pay(int amount) = 0;
    6. };
    7. // 具体策略类1:信用卡支付
    8. class CreditCardPayment : public PaymentStrategy {
    9. private:
    10. std::string cardNumber;
    11. std::string name;
    12. public:
    13. CreditCardPayment(const std::string& cardNumber, const std::string& name)
    14. : cardNumber(cardNumber), name(name) {}
    15. void pay(int amount) override {
    16. std::cout << amount << " paid using credit card." << std::endl;
    17. // 具体的支付逻辑
    18. }
    19. };
    20. // 具体策略类2:PayPal支付
    21. class PayPalPayment : public PaymentStrategy {
    22. private:
    23. std::string email;
    24. public:
    25. PayPalPayment(const std::string& email)
    26. : email(email) {}
    27. void pay(int amount) override {
    28. std::cout << amount << " paid using PayPal." << std::endl;
    29. // 具体的支付逻辑
    30. }
    31. };
    32. // 环境类
    33. class ShoppingCart {
    34. private:
    35. PaymentStrategy* paymentStrategy;
    36. public:
    37. void setPaymentStrategy(PaymentStrategy* strategy) {
    38. paymentStrategy = strategy;
    39. }
    40. void checkout(int amount) {
    41. if (paymentStrategy) {
    42. paymentStrategy->pay(amount);
    43. } else {
    44. std::cout << "Please set a payment strategy before checking out." << std::endl;
    45. }
    46. }
    47. };
    48. int main() {
    49. // 创建环境对象
    50. ShoppingCart cart;
    51. // 设置具体策略
    52. cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9876-5432", "John Doe"));
    53. // 执行支付操作
    54. cart.checkout(100);
    55. // 切换策略
    56. cart.setPaymentStrategy(new PayPalPayment("john@example.com"));
    57. // 再次执行支付操作
    58. cart.checkout(50);
    59. return 0;
    60. }

  • 相关阅读:
    模糊神经网络算法原理,模糊神经网络算法代码
    【Hack The Box】linux练习-- seal
    构建AR视频空间大数据平台(物联网及工业互联网、视频、AI场景识别)
    Windows10系统提速优化
    springboot项目使用validated参数校验框架
    0.go语言实用工具编写要这样学
    物理服务器安装CentOS 7操作系统
    java类和对象——static成员与代码块
    SpringBoot 常用注解的原理和使用
    使用 calc 计算保险实际收益率
  • 原文地址:https://blog.csdn.net/sjp11/article/details/133521573