网站制作方案费用,电脑wordpress,旅游网站开发的背景,广州电商网站开发策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式#xff0c;它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来#xff0c;使得算法可以独立于使用它的客户端而变化#xff0c;提高了代码的灵活性和可维护性。 其主要包含以下几个…策略模式介绍 文章目录 策略模式介绍C 代码示例 策略模式是一种行为设计模式它允许在运行时选择算法的行为。该模式将算法的定义和使用分离开来使得算法可以独立于使用它的客户端而变化提高了代码的灵活性和可维护性。 其主要包含以下几个角色
抽象策略Strategy定义了一个公共接口用于所有具体策略类实现这个接口声明了算法的方法签名客户端通过这个接口来调用具体的算法。具体策略Concrete Strategy实现了抽象策略接口提供具体的算法实现逻辑。不同的具体策略类实现了不同的算法可以根据具体需求进行替换。上下文Context持有一个对抽象策略的引用通过这个引用调用具体策略的算法方法。上下文类负责与客户端交互并根据情况决定使用哪个具体策略。
使用策略模式的好处在于
可扩展性强当需要添加新的算法时只需创建新的具体策略类实现抽象策略接口即可不需要修改现有代码的核心逻辑符合开闭原则对扩展开放对修改关闭。代码复用性高具体策略类可以在不同的上下文中被复用只要符合抽象策略定义的接口规范就行。便于维护和测试由于每个算法都独立在具体策略类中实现代码结构清晰便于单独对各个算法进行维护和测试。
C 代码示例
以下是一个简单的用 C 实现的策略模式示例模拟一个电商系统中不同的折扣策略计算商品最终价格的场景。
#include iostream
#include string// 抽象策略类定义折扣计算的接口
class DiscountStrategy {
public:virtual double calculateDiscount(double price) 0;virtual ~DiscountStrategy() {}
};// 具体策略类1满减折扣策略
class FullReductionStrategy : public DiscountStrategy {
public:double calculateDiscount(double price) override {if (price 200) {return price * 0.2; // 满200减20%}return 0;}
};// 具体策略类2固定折扣策略
class FixedDiscountStrategy : public DiscountStrategy {
public:double calculateDiscount(double price) override {return price * 0.1; // 固定打9折}
};// 上下文类持有折扣策略引用并执行折扣计算
class ShoppingCart {
public:ShoppingCart(DiscountStrategy* strategy) : m_strategy(strategy) {}void setDiscountStrategy(DiscountStrategy* strategy) {m_strategy strategy;}double calculateFinalPrice(double price) {double discount m_strategy-calculateDiscount(price);return price - discount;}private:DiscountStrategy* m_strategy;
};int main() {// 创建具体策略对象FullReductionStrategy fullReduction;FixedDiscountStrategy fixedDiscount;// 创建上下文对象并传入具体策略对象ShoppingCart cart1(fullReduction);ShoppingCart cart2(fixedDiscount);double price 300;std::cout 使用满减策略商品价格为 price 时最终价格: cart1.calculateFinalPrice(price) std::endl;std::cout 使用固定折扣策略商品价格为 price 时最终价格: cart2.calculateFinalPrice(price) std::endl;// 更换策略并重新计算价格cart1.setDiscountStrategy(fixedDiscount);std::cout 更换为固定折扣策略后商品价格为 price 时最终价格: cart1.calculateFinalPrice(price) std::endl;return 0;
}下面对上述代码进行详细解释 抽象策略类 DiscountStrategy 它定义了一个纯虚函数 calculateDiscount这个函数接收商品价格作为参数用于计算折扣金额返回值是折扣的具体数值以价格的比例形式体现。纯虚函数的存在使得这个类成为抽象类不能直接实例化必须由具体的子类来实现其 calculateDiscount 方法。虚析构函数 ~DiscountStrategy() 的定义是为了保证在通过基类指针删除派生类对象时能够正确调用派生类的析构函数避免内存泄漏等问题遵循了多态情况下正确析构的原则。 具体策略类 FullReductionStrategy实现了 DiscountStrategy 抽象策略接口在 calculateDiscount 方法中定义了满减的折扣逻辑即当商品价格大于等于200时给予20%的折扣否则没有折扣返回0。FixedDiscountStrategy同样实现了抽象接口其折扣逻辑是固定给予商品价格10%的折扣无论商品价格具体是多少。 上下文类 ShoppingCart 它有一个私有成员变量 m_strategy类型是指向 DiscountStrategy 抽象策略类的指针通过构造函数或者 setDiscountStrategy 方法来初始化或更换这个指针所指向的具体策略对象。calculateFinalPrice 方法用于根据当前持有的具体策略计算商品的最终价格它先调用 m_strategy 指向的具体策略对象的 calculateDiscount 方法获取折扣金额然后用商品原价减去折扣金额得到最终价格。 main 函数部分 首先创建了两个具体策略类的对象 fullReduction满减策略和 fixedDiscount固定折扣策略。接着创建了两个 ShoppingCart 上下文对象 cart1 和 cart2并分别在构造函数中传入不同的具体策略对象这样 cart1 初始使用满减策略cart2 使用固定折扣策略。然后通过调用 calculateFinalPrice 方法分别计算并展示了商品价格为300时不同策略下的最终价格。之后又通过 cart1 的 setDiscountStrategy 方法将其使用的策略更换为固定折扣策略并再次计算和展示了最终价格体现了策略模式可以在运行时灵活切换算法策略的特点。
通过这个示例可以看到策略模式将不同的折扣算法封装在各自的具体策略类中而 ShoppingCart 上下文类只需要关心抽象策略接口根据具体情况使用不同的具体策略来计算最终价格使得代码结构清晰易于扩展和维护。例如如果后续要添加一个新的折扣策略如会员专享折扣策略等只需要创建一个新的具体策略类实现 DiscountStrategy 接口并在需要的地方如 ShoppingCart 上下文对象中使用这个新策略即可不需要修改原有的核心代码逻辑。