在软件开发中,设计模式是提高代码可读性、可维护性和可扩展性的重要工具之一。其中,策略模式是一种行为型设计模式,它允许在运行时选择不同算法的行为,并支持不同策略的无缝切换。
概述
策略模式定义了一系列算法/场景,并使它们能够相互替换,从而使算法可以独立于其使用者而变化。在策略模式中,算法被封装成单独的类,使得它们可以在运行时切换。
结构
由上图可知,策略模式可分为如下三个层级:
环境(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 代码示例,我们了解了策略模式的基本结构和应用场景,并实现了一个简单的购物车系统来演示其用法。