前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++设计模式——策略模式

C++设计模式——策略模式

作者头像
程序员的园
发布2024-07-18 13:21:16
830
发布2024-07-18 13:21:16
举报
文章被收录于专栏:程序员的园——原创文章
背景

在软件开发中,设计模式是提高代码可读性、可维护性和可扩展性的重要工具之一。其中,策略模式是一种行为型设计模式,它允许在运行时选择不同算法的行为,并支持不同策略的无缝切换。

概述

策略模式定义了一系列算法/场景,并使它们能够相互替换,从而使算法可以独立于其使用者而变化。在策略模式中,算法被封装成单独的类,使得它们可以在运行时切换。

结构

由上图可知,策略模式可分为如下三个层级:

环境(Context):维护一个指向策略对象的引用,可以动态改变所采用的策略。

抽象策略类:定义了所有支持的算法的通用接口。

具体策略类:实现了策略接口,提供具体的算法。

特性

策略模式的主要特性如下:

  • 封装算法:策略模式将不同的算法封装到各自的策略类中,使得每个算法可以独立于其他算法进行修改、扩展和维护,提高了代码的可维护性和可扩展性。
  • 策略的替换:由于每个算法都被封装在独立的策略类中,因此可以在不修改客户端代码的情况下动态地切换或替换算法,提供了灵活性和可定制性。
  • 减少条件语句:策略模式可以避免使用大量的条件语句来选择不同的算法,使得代码更加清晰、简洁和易于理解。
  • 增强了扩展性:通过定义抽象的策略接口和具体的策略实现类,可以轻松地新增新的算法策略,而不影响现有的代码结构,符合开闭原则。
  • 独立的策略类:每个具体策略类都相互独立,使得策略的变化不会影响到其他部分的代码,提高了代码的模块化和复用性。
  • 提高了可测试性:由于每个算法都被封装在独立的策略类中,可以针对每个策略类编写单元测试,从而更容易进行测试和调试。

代码示例

需求

假设有如下需求,某个酒店拥有自己的会员等级和会员制度,普通会员没有折扣;黄金会员享受9折优惠;钻石会员享受8折优惠;如何设计这套系统。

代码

代码语言:javascript
复制
#pragma once
#include <iostream>

// 策略接口
class DiscountStrategy {
public:
    virtual double applyDiscount(double amount) const = 0;
};

// 具体策略:普通会员
class RegularMemberStrategy : public DiscountStrategy {
public:
    double applyDiscount(double amount) const override {
        return amount; // 没有折扣
    }
};

// 具体策略:黄金会员
class GoldMemberStrategy : public DiscountStrategy {
public:
    double applyDiscount(double amount) const override {
        return amount * 0.9; // 九折优惠
    }
};

// 具体策略:钻石会员
class DiamondMemberStrategy : public DiscountStrategy {
public:
    double applyDiscount(double amount) const override {
        return amount * 0.8; // 八折优惠
    }
};

// 环境
class ShoppingCart {
private:
    DiscountStrategy* strategy;

public:
    ShoppingCart(DiscountStrategy* strategy) : strategy(strategy) {}

    double checkout(double amount) const {
        return strategy->applyDiscount(amount);
    }

};

int test_strategy() {

    //普卡
    ShoppingCart regular_cart(new RegularMemberStrategy());
    double totalAmount = 100.0;
    double finalAmount = regular_cart.checkout(totalAmount);
    std::cout << "Final amount for regular member: $" << finalAmount << std::endl;

    // 黄金会员卡
    ShoppingCart gold_cart(new GoldMemberStrategy());
    finalAmount = gold_cart.checkout(totalAmount);
    std::cout << "Final amount for gold member: $" << finalAmount << std::endl;

    // 切换策略为钻石会员
    ShoppingCart diamond_cart(new DiamondMemberStrategy());
    finalAmount = diamond_cart.checkout(totalAmount);
    std::cout << "Final amount for diamond member: $" << finalAmount << std::endl;

    return 0;
}
/*
Final amount for regular member: $100
Final amount for gold member: $90
Final amount for diamond member: $80
*/

在这个示例中,我们定义了三种具体的会员等级策略,并通过 ShoppingCart 类来动态选择不同的策略。每种会员等级对应的折扣力度在不同的具体策略中实现。

总结

策略模式是一种简单而灵活的设计模式,可以在运行时动态选择算法,从而提高代码的可扩展性和可维护性。通过C++代码示例,我们了解了策略模式的基本结构和应用场景,并实现了一个简单的购物车系统来演示其用法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档