重读设计模式——策略

意图#

定义一系列的算法,把它们一个个地封装起来,并让它们可以互相替换。这样使得算法可以随时替换和变更,典型的比如超市的降价策略,同样的商品可能每天有不同的折扣。

示例#

class DiscountStrategy {
public:
    virtual void discount() = 0;
};

class TenPercent : public DiscountStrategy {
public:
    void discount() override {
        cout << "10% discount!\n";
    }
};

class TwentyPercent : public DiscountStrategy {
public:
    void discount() override {
        cout << "20% discount!\n";
    }
};

class ThirtyPercent : public DiscountStrategy {
public:
    void discount() override {
        cout << "30% discount!\n";
    }
};

class Supermarket {
public:
    Supermarket() = default;
    
    void setDiscount(const std::shared_ptr<DiscountStrategy>& strategy) {
        m_discount = strategy;
    }
    
    void discount() {
        m_discount->discount();
    }

private:
    std::shared_ptr<DiscountStrategy> m_discount{ nullptr };
};

int main() {
    Supermarket market;
    market.setDiscount(std::make_shared<TenPercent>());
    market.discount();
    market.setDiscount(std::make_shared<TwentyPercent>());
    market.discount();
    market.setDiscount(std::make_shared<ThirtyPercent>());
    market.discount();
    
    return 0;
}

当超市需要打折的时候,就选择一个打折策略即可,这大大增加了打折的灵活性和扩展性,之后有了新的打折模式,只需要再新增一个打折的策略类即可。

演示代码存在个问题,如果不设置策略,策略指针为空,直接执行打折方法的话会崩溃,可以通过指定一个默认的打折模式来解决。

要点#

  • 策略模式和状态模式很像,区别在于侧重点不同:状态侧重于当对象的状态改变时需要去做什么,而策略侧重于如何去做,当然在实际应用中完全可以不考虑两者的区别,结合着使用。
  • 策略对象往往是享元模式中很好的轻量级对象。

作者:cwtxx

出处:https://www.cnblogs.com/cwtxx/p/18718230

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   cwtxx  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示