策略模式(大话设计模式)C/C++版本

news2024/9/9 0:39:55

策略模式

在这里插入图片描述
商场收银软件
根据客户所购买商品的单价和数量来收费

需求分析:

1. 输入单价+数量 => 界面逻辑
2. 计算(可能打折或者促销) => 业务逻辑
3. 输出结果 => 界面逻辑

感觉和计算器的逻辑流程差不多,可以用简单工厂模式实现吗?

可以但是不推荐
1. 简单工厂更多的语义是对象的创建问题
2. 而这里所谓的打折或促销的变化,更多的是算法(业务流程)的变化

策略模式较于简单工程模式

  1. 策略模式和简单工厂模式的UML区别:关联和聚合的区别
    而区别在代码上的体现就是:
    简单工厂模式侧重创建,接口语义设计更多的是create,返回的也就是对象
    策略模式侧重算法切换,接口语义设计更多的是传参使用参数对象的算法,返回的也就是策略
  2. 针对不同的促销手段类的扩展
    如果使用简单工厂类,则需要增加新的类后,还要修改工厂类;而策略模式是不需要的。
    策略模式只需要将促销手段类作为属性保存,然后在客户端调用,是可以被context类共享的。

策略模式深度分析:

  1. Strategy类在策略模式中的定位主要是封装算法或行为。
    它的设计重点在于提供一套清晰的接口,使得算法的实现可以被外部的Context对象调用,而不需要关心具体的实现细节。
    Strategy类的实例通常不包含任何唯一标识属性,因为它们的主要职责是执行特定的算法逻辑,而非存储数据或状态。
  2. 在策略模式中,Strategy类就像是一个工具箱中的工具,每个工具(Strategy实例)都有其特定的功能。
    Context对象就像是使用者,它可以根据当前的需求从工具箱中选择合适的工具(Strategy实例)来完成特定的任务。
    这种设计允许Context对象在运行时灵活地更换所使用的工具,而不需要修改自身的代码。
  3. Strategy类在策略模式中扮演的是算法提供者的角色,它通过清晰的接口对外提供服务,而内部的具体实现细节对外部使用者是透明的。
    这种设计模式鼓励将行为的定义和行为的使用分离,从而促进代码的模块化和可维护性。

C++

#include <algorithm>
#include <iostream>
using namespace std;
#define free_ptr(p) \
    if (p)          \
        delete p;   \
    p = nullptr;

// Strategt类,定义所有支持的算法的公共接口
class Strategy
{
public:
    virtual ~Strategy(){};
    virtual void AlgorithmInterface() = 0;
};

// ConcreteStrategy 封装了具体的算法或行为,继承Strategy
class ConcreteStrategyA : public Strategy
{
    void AlgorithmInterface()
    {
        cout << "算法A实现" << endl;
    }
};

class ConcreteStrategyB : public Strategy
{
    void AlgorithmInterface()
    {
        cout << "算法B实现" << endl;
    }
};

class ConcreteStrategyC : public Strategy
{
    void AlgorithmInterface()
    {
        cout << "算法C实现" << endl;
    }
};

// Context,用一个ConcreteStrategy来配置,维护一个对Strategy的引用
class Context
{
public:
    Context(Strategy *strategy) : m_strategy(strategy){};
    ~Context() { free_ptr(m_strategy); }
    void AlgorithmInterface()
    {
        m_strategy->AlgorithmInterface();
    };

private:
    Strategy *m_strategy;
};

int main()
{
    Context *ContextA = new Context(new ConcreteStrategyA());
    Context *ContextB = new Context(new ConcreteStrategyB());
    Context *ContextC = new Context(new ConcreteStrategyC());

    ContextA->AlgorithmInterface();
    ContextB->AlgorithmInterface();
    ContextC->AlgorithmInterface();

    free_ptr(ContextA);
    free_ptr(ContextB);
    free_ptr(ContextC);
    return 0;
}

C

#include <stdio.h>

// 定义策略函数指针类型
typedef void (*StrategyFunc)(void);

// 定义策略结构体
typedef struct
{
    StrategyFunc strategyActioin;
} Strategy;

// 实现具体的策略A
void StrategyA()
{
    printf("算法A实现\n");
}

// 实现具体的策略B
void StrategyB()
{
    printf("算法B实现\n");
}

// 实现具体的策略C
void StrategyC()
{
    printf("算法C实现\n");
}

// 定义上下文结构体,用于封装策略
typedef struct
{
    Strategy strategy;
} Context;

// 创建上下文并设置策略
Context createContext(StrategyFunc strategy)
{
    Context context;
    context.strategy.strategyActioin = strategy;
    return context;
}

int main()
{
    // 创建不同的上下文,每个上下文使用不同的策略
    Context contextA = createContext(StrategyA);
    Context contextB = createContext(StrategyB);
    Context contextC = createContext(StrategyC);

    // 执行不同的策略
    contextA.strategy.strategyActioin();
    contextB.strategy.strategyActioin();
    contextC.strategy.strategyActioin();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1917225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浪潮天启防火墙TQ2000远程配置方法SSL-xxx、L2xx 配置方法

前言 本次设置只针对配置VXX&#xff0c;其他防火墙配置不涉及。建议把防火墙内外网都调通后再进行Vxx配置。 其他配置可参考&#xff1a;浪潮天启防火墙配置手册 配置SSLVxx 在外网端口开启SSLVxx信息 开启SSLVxx功能 1、勾选 “启用SSL-Vxx” 2、设置登录端口号&#xff0…

Unity3D 太空大战射击游戏

一、前言 本案例是初级案例&#xff0c;意在帮助想使用unity的初级开发者能较快的入门&#xff0c;体验unity开发的方便性和简易性能。 本次我们将使用团结引擎进行开发&#xff0c;帮助想体验团结引擎的入门开发者进行较快的环境熟悉。 本游戏案例以太空作战为背景&#xff0c…

如何分析软件测试中发现的Bug!

假如你是一名软件测试工程师&#xff0c;每天面对的就是那些“刁钻”的Bug&#xff0c;它们像是隐藏在黑暗中的敌人&#xff0c;时不时跳出来给你一个“惊喜”。那么&#xff0c;如何才能有效地分析和处理这些Bug&#xff0c;让你的测试工作变得高效且有趣呢&#xff1f;今天我…

Threadlocal使用获取最后更新人信息

Threadlocal 的作用范围是一个线程&#xff0c;tomcat启动默认开启一个线程 首先点击登录&#xff0c;登录方法会返回token 拿到token后放在请求头中发送商品的插入请求&#xff0c;在插入是设置拿到token中的nickName&#xff08;花名&#xff09;放入&#xff08;lastUpdate…

C 语言中如何实现字符串的拼接?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 【https://dwz.mosong.cc/cyyjc】通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&…

轻松搭建RAG:澳鹏RAG开发工具

我们很高兴地宣布推出RAG开发工具&#xff0c;这是澳鹏大模型智能开发平台的一项新功能。此功能可帮助团队轻松创建高质量的检索增强生成 (RAG) 模型。 什么是 RAG&#xff1f; 检索增强生成 (RAG) 通过利用大量外部数据源&#xff08;例如企业的知识库&#xff09;显著增强了…

git查看版本,查看安装路径、更新版本

git version 查看版本 git update-git-for-windows 更新版本 git version 查看版本

美客多卖家必备:自养号测评补单技术的实战策略

构建美客多&#xff08;MercadoLibre&#xff09;自养号测评体系的稳健策略 一、确立目标与前期筹备 深入理解平台规范&#xff1a;首要任务是深入研究美客多平台的规则与指导方针&#xff0c;确保所有行动均符合平台要求&#xff0c;避免任何违规行为导致账号受限。 明确测评…

光电门验证动量守恒实验

本实验所需器件与第二个实验相同。但是连线方式有所区别&#xff0c;先将Arduino的电源输出接到两个光电门&#xff0c;然后再将光电门1的信号输出线接到Arduino的第10个端口&#xff0c;光电门2的信号输出线接到Arduino的第11个端口。对Arduino写入下列程序&#xff08;只有主…

删除【此电脑】中设备和驱动器下的迅雷下载方法

删除【此电脑】中设备和驱动器下的迅雷下载方法 我们安装迅雷下载、百度网盘、WPS等软件后&#xff0c;在【此电脑】–> 【设备和驱动器】目录下会看到这些驱动器的快捷方式&#xff0c;可以使用删除注册表的方式删除这些东西 启动注册表管理器 首先使用键盘快捷键 Win …

新零售起盘案例「半藏酱酒」布局路径,半藏总院分院招商模式

在当前白酒市场中&#xff0c;一款名为半藏酒的酒品以其独特的新零售模式引起了广泛关注。这种模式不同于传统销售方式&#xff0c;通过多种创新玩法&#xff0c;实现了销售与品牌推广的双重目标&#xff0c;让我们一起来看看细节。 半藏酒的分级代理制度将代理商分为两个层级&…

“未来城市发展之窗”2024上海城博会

随着2024年上海城市博览会的临近&#xff0c;招商工作正火热进行中&#xff0c;且已逐渐接近尾声。这场被誉为“城市未来之窗”的盛会&#xff0c;汇聚了全球各地的城市管理者、建筑师、规划师、投资者以及科技创新者&#xff0c;共同探讨城市发展的未来趋势和解决方案。 一、城…

JavaWeb-js(4)

js事件 在前端页面中&#xff0c;js程序大多数是由事件来驱动的&#xff0c;当触发某些事件的时候&#xff0c;可以使用js负责响应。 js事件由三部分组成: 事件源——》指的是被触发的对象; 事件类型——》如何触发的事件&#xff0c;如:鼠标单击、双击、键盘操作等;…

2024最新最全【Java】全栈,零基础入门到精通

Java基础 本文章是作者的学习笔记&#xff0c;帮助初学者快速入门&#xff0c;内容讲的不是很细&#xff0c;适合初学者&#xff0c;不定时更新。 目录 Java基础数据类型1.基本类型(primitive type)1-1 整数类型1-2 浮点类型1-3 字符类型1-4 boolean类型 2.引用数据类型3.类型…

2024.7.11最新版IDM破解,操作简单

前言 IDM的强劲对手&#xff0c;100%免费&#xff0c;如果破解IDM失败&#xff0c;推荐使用FDM&#xff0c;下载地址&#xff1a;Free Download Manager 破解步骤 打开PowerShell&#xff0c;非CMD 在左下角开始菜单右键点击后选择PowerShell&#xff0c;注意不是打开CMD。…

大模型时代的基础架构:大模型算力中心建设指南

&#x1f482; 个人网站:【 摸鱼游戏】【网址导航】【神级代码资源网站】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

hbase学习

hbase学习 hbase概述&#xff1a; HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;用于存储海量的结构化或者半结构化&#xff0c;非结构化的数据&#xff08;底层是字节数组做存储的&#xff09; HBase是Hadoop的生态系统之一&#xff0c;是建立在…

开源浏览器引擎:WebKit简介及工作流程、优缺点

WebKit是一个开源的浏览器引擎&#xff0c;最初由苹果公司基于KHTML&#xff08;K Desktop Environment的HTML渲染引擎&#xff09;开发&#xff0c;并广泛应用于Safari浏览器&#xff0c;后来也被其他多款浏览器和应用采用。WebKit负责解析HTML、CSS、JavaScript等网页内容&am…

【动态规划Ⅳ】二维数组的动态规划——最小路径和

二维数组的动态规划 最小路径和64. 最小路径和原地修改数组定义二维数组进行状态转移优化&#xff1a;用 一维数组进行状态转移相似题目&#xff1a;LCR 166. 珠宝的最高价值 120. 三角形最小路径和原地修改数组定义二维数组进行状态转移一维数组进行状态转移自底向上&#xff…

获取商铺信息,以及商铺信息的增删改查

本文章主要讲述如何对商铺信息进行基本的增删改查操作&#xff0c;及数据库对比。 1、获取首页仪表盘统计数据接口 待收费金额&#xff1a; SELECT count(1) as count,IFNULL(sum(total),0)as sum FROM payment_bill WHERE enabled_mark 1 AND pay_state0 欠费数据&#xf…