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

2024-07-18 13:21:16 浏览数 (2)

背景

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

概述

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

结构

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

环境(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 代码示例,我们了解了策略模式的基本结构和应用场景,并实现了一个简单的购物车系统来演示其用法。

0 人点赞