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

这篇具有很好参考价值的文章主要介绍了C++ 设计模式之策略模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【声明】本题目来源于卡码网(题目页面 (kamacoder.com))

【提示:如果不想看文字介绍,可以直接跳转到C++编码部分】


【设计模式大纲】

C++ 设计模式之策略模式,c++,设计模式,策略模式,java

【简介】什么是策略模式(第14种模式)

        策略模式是⼀种⾏为型设计模式,它定义了⼀系列算法(这些算法完成的是相同的⼯作,只是实现不同),并将每个算法封装起来,使它们可以相互替换,⽽且算法的变化不会影响使⽤算法的客户。
        举个例⼦,电商⽹站对于商品的折扣策略有不同的算法,⽐如新⽤户满减优惠,不同等级会员的打折情况不同,这种情况下会产⽣⼤量的if-else语句, 并且如果优惠政策修改时,还需要修改原来的代码,不符合开闭原则
        这就可以将不同的优惠算法封装成独⽴的类来避免⼤量的条件语句,如果新增优惠算法,可以添加新的策略类来实现,客户端在运⾏时选择不同的具体策略,⽽不必修改客户端代码改变优惠策略。

C++ 设计模式之策略模式,c++,设计模式,策略模式,java


 【基本结构】

        策略模式包含下⾯⼏个结构:

  • 策略类Strategy : 定义所有⽀持的算法的公共接⼝。
  • 具体策略类ConcreteStrategy : 实现了策略接⼝,提供具体的算法实现。
  • 上下⽂类Context : 包含⼀个策略实例,并在需要时调⽤策略对象的⽅法。

    C++ 设计模式之策略模式,c++,设计模式,策略模式,java


 【简易实现】

        下面利用Java代码对策略模式的实现流程作以说明:

1. 抽象策略类

abstract class Strategy {
    // 抽象⽅法
    public abstract void algorithmInterface();
}

2. 具体策略类1

// 2. 具体策略类1
class ConcreteStrategyA extends Strategy {
    @Override
    public void algorithmInterface() {
        System.out.println("Strategy A");
        // 具体的策略1执⾏逻辑
    }
}

3.具体策略类2

// 3. 具体策略类2
class ConcreteStrategyB extends Strategy {
    @Override
    public void algorithmInterface() {
        System.out.println("Strategy B");
        // 具体的策略2执⾏逻辑
    }
}

4. 上下文类

// 4. 上下⽂类
class Context {
    private Strategy strategy;

    // 设置具体的策略
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    // 执⾏策略
    public void contextInterface() {
        strategy.algorithmlnterface();
    }
}

5. 客户端代码

// 5. 客户端代码
public class Main{
    public static void main(String[] args) {
    // 创建上下⽂对象,并设置具体的策略
    Context contextA = new Context(new ConcreteStrategyA());
    // 执⾏策略
    contextA.contextInterface();
    Context contextB = new Context(new ConcreteStrategyB());
    contextB.contextInterface();u
    }
}

【使用场景】

        那什么时候可以考虑使⽤策略模式呢?

  • 当⼀个系统根据业务场景需要动态地在⼏种算法中选择⼀种时,可以使⽤策略模式。例如,根据⽤户的⾏为选择不同的计费策略。
  • 当代码中存在⼤量条件判断,条件判断的区别仅仅在于⾏为,也可以通过策略模式来消除这些条件语句。

        在已有的⼯具库中,Java 标准库中的 Comparator 接⼝就使⽤了策略模式,通过实现这个接⼝,可以创建不同的⽐较器(指定不同的排序策略)来满⾜不同的排序需求。


【编码部分】

1. 题目描述

        小明家的超市推出了不同的购物优惠策略,你可以根据自己的需求选择不同的优惠方式。其中,有两种主要的优惠策略: 

        1. 九折优惠策略:原价的90%。 

        2. 满减优惠策略:购物满一定金额时,可以享受相应的减免优惠。

具体的满减规则如下: 

        满100元减5元 

        满150元减15元 

        满200元减25元 

        满300元减40元

请你设计一个购物优惠系统,用户输入商品的原价和选择的优惠策略编号,系统输出计算后的价格。

2. 输入描述

        输入的第一行是一个整数 N(1 ≤ N ≤ 20),表示需要计算优惠的次数。 接下来的 N 行,每行输入两个整数,第一个整数M( 0 < M < 400) 表示商品的价格, 第二个整数表示优惠策略,1表示九折优惠策略,2表示满减优惠策略;

3. 输出描述

        每行输出一个数字,表示优惠后商品的价格;

4. C++ 编码实例

/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file StrategyMode.hpp
* @brief 策略模式
* @autor 写代码的小恐龙er
* @date 2024/01/16
*/

#include <iostream>
#include <string>
#include <vector>

using namespace std;

// 前置声明

// 优惠策略的抽象接口类
class AbstractStrategy;

// 优惠策略的具体实现类1 -- 打 九折 
class StrategyNineDiscount;

// 优惠策略的具体实现类2 -- 满减
class StrategyFullOut;

// 上下文类 -- 调用优惠策略类
class DiscountContext;

// 类的定义

// 优惠策略的抽象接口类
class AbstractStrategy
{
// 接口函数
public:
    // 传入参数为 商品的原始价格 返回值为优惠后的价格
    virtual int ApplyDiscount(int originalPrice) = 0;
};


// 优惠策略的具体实现类1 -- 打 九折 
class StrategyNineDiscount : public AbstractStrategy
{
// 成员函数
public:
    StrategyNineDiscount(){}
    // 重载 优惠函数
    int ApplyDiscount(int originalPrice) override {
        return (int) (originalPrice * 0.9);
    }
};


// 优惠策略的具体实现类2 -- 满减
class StrategyFullOut : public AbstractStrategy
{
// 成员数据
private:
    int _prices[4] = {100, 150, 200, 300};
    int _discounts[4] = {5, 15, 25, 40};
// 成员函数
public:
    StrategyFullOut(){}
    // 重载 优惠函数
    int ApplyDiscount(int originalPrice) override { 
        // 从最大的优惠开始判断
        int length = sizeof(_prices) / sizeof(_prices[0]);
        for(int i = length - 1; i >= 0; i--)
        {
            if(originalPrice >= _prices[i]){
                return originalPrice - _discounts[i];
            }
        }
        // 未达到满减优惠区间 
        return originalPrice;
    }
};

// 上下文类 -- 调用优惠策略类
class DiscountContext
{
// 成员数据
private:
    AbstractStrategy *_strategy;
// 成员函数
public:
    //通过传入策略基类来构造该类的实例
    DiscountContext(AbstractStrategy *strategy){
        this->_strategy = strategy;
    }    
    // 管理优惠函数
    int ApplyDiscount(int originalPrice){ 
        if(_strategy == nullptr) return 0;
        else return _strategy->ApplyDiscount(originalPrice);
    }
};

int main()
{
    // 优惠次数
    int discountNum = 0;
    // 输入
    std::cin >> discountNum;
    // 构造上下文管理类
    DiscountContext *discountContext = nullptr;
    // 构造抽象策略类
    AbstractStrategy *strategy = nullptr;
    // 遍历输入所有的价格
    for(int i = 0; i < discountNum; i++)
    {
        // 原始价格 和 优惠策略
        int originalPrice = 0;
        int discountType = 0;
        // 输入 
        std::cin >> originalPrice >> discountType;
        // 根据打折类型来操作
        if(discountType == 1){
            // 构造具体的优惠类
            strategy = new StrategyNineDiscount();
        }
        else if(discountType == 2){
            // 构造具体的优惠类
            strategy = new StrategyFullOut();
        }
        else std::cout << originalPrice << endl;
        
        discountContext = new DiscountContext(strategy);
        // 使用优惠函数
        originalPrice = discountContext->ApplyDiscount(originalPrice);
        std::cout<< originalPrice << endl;
    }
    
    // 析构
    if(strategy != nullptr){
        delete strategy;
        strategy = nullptr;
    }
    
    if(discountContext != nullptr){
        delete discountContext;
        discountContext = nullptr;
    }
    return 0;
}



......

To be continued.文章来源地址https://www.toymoban.com/news/detail-797138.html

到了这里,关于C++ 设计模式之策略模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式——策略模式

    1. 策略模式简介 策略模式: 策略模式是一种行为型模式, 它将对象和行为分开, 将行为定义为一个行为接口和具体行为的实现 策略模式最大的特点是行为的变化, 行为之间可以相互替换 每个if判断都可以理解为一个策略. 本模式是的算法可独立于使用它的用户而变化 2. 模式结构

    2024年02月11日
    浏览(37)
  • java设计模式---策略模式

    策略设计模式是一种行为设计模式。当在处理一个业务时,有多种处理方式,并且需要再运行时决定使哪一种具体实现时,就会使用策略模式。 策略模式的类图: 在支付业务中,有三种付款方式,程序运行时使用哪种方式由用户选择,根据用户选择执行不同的逻辑。 首先,

    2024年02月10日
    浏览(32)
  • Java特性之设计模式【策略模式】

    概述 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法 主要解决 :在有多种

    2024年02月08日
    浏览(39)
  • Java设计模式之策略模式详解

    大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们一同踏入Java设计模式之策略模式的世界,探讨代码中的智慧抉择。 策略模式的核心思想 策略模式是一种行为型设计模式,它定义了算法家族

    2024年01月20日
    浏览(34)
  • Java设计模式——策略

    前言 策略模式是平时Java开发中常用的一种,虽然已有很多讲解设计模式的文章,但是这里还是写篇文章来从自己理解的角度讲解一下。 我们不妨进行场景假设,要对我们的软件进行授权管理:在启动我们的软件之前先要校验是否存在合法的授权,如果授权不合法则要求用户

    2024年02月20日
    浏览(32)
  • Java设计模式之策略(Strategy)模式

    策略(Strategy)设计模式定义了一系列算法,将它们封装起来,并且可以相互替换使用,从而使得算法可以独立于使用它的客户而变化。 策略(Strategy)设计模式是一种行为型设计模式,它允许在运行时动态地选择算法。策略模式将算法封装为算法族,从而可以在运行时根据

    2024年02月15日
    浏览(36)
  • Java设计模式—策略模式(Strategy Mode)

    目录 前言 一、策略模式的简介 二、策略模式的概念 三、策略模式的作用 四、策略模式的优、缺点 策略模式的优点: 策略模式的缺点: 五、策略模式应用场景 六、代码案例 1)抽象接口类 2)具体的策略类:减 3)具体策略类:打折 4)上下文类 5)客户端Main代码测试 总结

    2024年02月08日
    浏览(33)
  • Java设计模式-策略模式-基于Spring实现

    策略模式是一种行为设计模式,它允许在运行时选择算法的行为。它将算法封装在 独立的策略类 中,使得它们可以相互替换,而不影响客户端代码。这种模式通过 将算法的选择从客户端代码中分离出来 ,提供了更大的灵活性和可维护性。 在Java中,策略模式的设计理念可以

    2024年02月08日
    浏览(50)
  • C++ 程序设计:四大模式(工厂+装饰+策略+观察者)

    \\\"工厂+装饰+策略+观察者\\\"是常见且常用的设计模式之一,但并不是指称\\\"四大模式\\\"的官方术语。 \\\" 四大模式 \\\"通常是指指令式面向对象编程中的四个基本概念: 封装 、 继承 、 多态 和 抽象 。这四个概念是面向对象编程的基石。 工厂模式( 例:工厂方法模式 )中,通常存在

    2024年02月17日
    浏览(33)
  • Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

            在平时的开发中,涉及到设计模式的有两块内容,第一个是我们 平时使用的框架 (比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。         面试官一般比较关心的是你在开发过程中, 有没有使用过设计模式,或者你在简历上写了关于设计

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包