当前位置: 首页 > news >正文

00000007_C语言设计模式

C语言设计模式

尽管 C 语言并不直接支持面向对象编程,但通过结构体和函数指针的灵活运用,我们依然可以实现多种经典的设计模式。

1. 工厂模式

1.1 工厂方法的定义与实现

工厂模式通过统一的接口创建对象,客户端无需知道具体的创建逻辑。

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 抽象产品类型定义
typedef struct Product {void (*use)(struct Product*); // 指向具体产品使用方法的函数指针
} Product;// 具体产品A定义
typedef struct {Product base;char* name;
} ProductA;// 产品A的使用方法实现
void useProductA(Product* base) {ProductA* self = (ProductA*)base;printf("Using Product A: %s\n", self->name);
}// 具体产品B定义
typedef struct {Product base;int version;
} ProductB;// 产品B的使用方法实现
void useProductB(Product* base) {ProductB* self = (ProductB*)base;printf("Using Product B: version %d\n", self->version);
}// 工厂方法,根据类型创建不同的产品
Product* createProduct(const char* type) {if (strcmp(type, "A") == 0) {ProductA* product = malloc(sizeof(ProductA));product->base.use = useProductA;product->name = "Example A";return (Product*)product;} else if (strcmp(type, "B") == 0) {ProductB* product = malloc(sizeof(ProductB));product->base.use = useProductB;product->version = 1;return (Product*)product;}return NULL;
}// 测试工厂模式
int main() {Product* p1 = createProduct("A");Product* p2 = createProduct("B");p1->use(p1);p2->use(p2);free(p1);free(p2);return 0;
}
1.2 适用场景
  • 数据库连接:根据需求创建不同类型的数据库连接对象。
  • 图形系统:动态创建圆形、矩形等不同的图形对象。
  • 日志系统:创建不同日志记录方式的对象,如文件日志或控制台日志。

2. 策略模式

2.1 策略模式的实现

策略模式通过函数指针实现不同策略的切换。

代码示例:

#include <stdio.h>
#include <stdlib.h>// 策略类型定义
typedef struct {void (*execute)(void); // 指向策略实现的函数指针
} Strategy;// 策略A实现
void strategyA() {printf("Executing Strategy A\n");
}// 策略B实现
void strategyB() {printf("Executing Strategy B\n");
}// 测试策略模式
int main() {Strategy strategy;// 使用策略Astrategy.execute = strategyA;strategy.execute();// 切换为策略Bstrategy.execute = strategyB;strategy.execute();return 0;
}
2.2 适用场景
  • 排序算法:动态选择快速排序、归并排序等不同算法。
  • 支付系统:支持支付宝、微信支付等多种支付方式切换。
  • 文件压缩:选择不同的压缩算法,如ZIP或RAR。

3. 观察者模式

3.1 观察者模式的实现

观察者模式实现一对多的通知机制。

代码示例:

#include <stdio.h>
#include <stdlib.h>// 观察者接口定义
typedef struct Observer {void (*update)(struct Observer*, const char* message); // 更新方法struct Observer* next; // 链表指针,指向下一个观察者
} Observer;// 具体观察者定义
typedef struct {Observer base;char* name;
} ConcreteObserver;// 具体观察者的更新方法实现
void observerUpdate(Observer* base, const char* message) {ConcreteObserver* self = (ConcreteObserver*)base;printf("%s received: %s\n", self->name, message);
}// 主题(Subject)定义
typedef struct {Observer* observers; // 链表头指针,保存所有观察者
} Subject;// 添加观察者到主题
void addObserver(Subject* subject, Observer* observer) {observer->next = subject->observers;subject->observers = observer;
}// 通知所有观察者
void notifyObservers(Subject* subject, const char* message) {Observer* current = subject->observers;while (current) {current->update(current, message);current = current->next;}
}// 测试观察者模式
int main() {Subject subject = { .observers = NULL };// 创建两个观察者ConcreteObserver o1 = { .base.update = observerUpdate, .name = "Observer 1" };ConcreteObserver o2 = { .base.update = observerUpdate, .name = "Observer 2" };// 将观察者添加到主题中addObserver(&subject, (Observer*)&o1);addObserver(&subject, (Observer*)&o2);// 通知所有观察者notifyObservers(&subject, "Event happened");return 0;
}
3.2 适用场景
  • GUI事件:按钮点击后通知多个事件监听器。
  • 实时数据监控:股票价格变动后通知多个用户。
  • 发布-订阅系统:如聊天室中用户订阅消息后实时接收。

相关文章:

00000007_C语言设计模式

C语言设计模式 尽管 C 语言并不直接支持面向对象编程&#xff0c;但通过结构体和函数指针的灵活运用&#xff0c;我们依然可以实现多种经典的设计模式。 1. 工厂模式 1.1 工厂方法的定义与实现 工厂模式通过统一的接口创建对象&#xff0c;客户端无需知道具体的创建逻辑。 代…...

探索数据存储的奥秘:深入理解B树与B+树

key value 类型的数据红黑树&#xff08;最优二叉树&#xff0c;内存最优&#xff09;&#xff0c;时间复杂度&#xff1a;O&#xff08;logn&#xff09;,调整方便&#xff1b;一个结点分出两个叉B树一个节点可以分出很多叉数据量相等的条件下&#xff1a;红黑树的层数很高&am…...

Web渗透测试之XSS跨站脚本之JS输出 以及 什么是闭合标签 一篇文章给你说明白

目录 闭合标签 XSS之js输出 闭合标签 封闭标签 达到 让标签值不当成 一个属性值来展示 从而达到xss注入的效果 "> 为了想办法闭合前面的标签,不用也行成功率高一些 攻击方法 "><script>confirm(1)</script>, 其中 "> 我们称之为完成闭合…...

EasyExcel的应用

一、简单使用 引入依赖&#xff1a; 这里我们可以使用最新的4.0.2版本&#xff0c;也可以选择之前的稳定版本&#xff0c;3.1.x以后的版本API大致相同&#xff0c;新的版本也会向前兼容&#xff08;3.1.x之前的版本&#xff0c;部分API可能在高版本被废弃&#xff09;&…...

VS Code的设置功能以及多层级的设置方式与解密

VS Code的Settings功能为用户提供了极大的灵活性和便利性&#xff0c;使得用户可以根据自己的需求和偏好来定制编辑器的行为和外观。 Settings 可以实现的具体功能 VS Code的设置项非常丰富&#xff0c;涵盖了各个方面&#xff0c;包括但不限于&#xff1a; 编辑器选项&…...

UI自动化测试框架playwright--初级入门

一、背景&#xff1a;UI自动化的痛点&#xff1a; 1、设计脚本耗时&#xff1a; 需要思考要如何模拟用户的操作&#xff0c;如何触发页面的事件&#xff0c;还要思考如何设计脚本&#xff0c;定位和操作要交互的元素、路径、位置&#xff0c;再编写代码逻辑&#xff0c;往复循…...

SQL多表联查、自定义函数(字符串分割split)、xml格式输出

记录一个报表的统计&#xff0c;大概内容如下&#xff1a; 多表联查涉及的报表有&#xff1a;房间表、买家表、合同表、交易表、费用表、修改记录表 注意&#xff1a;本项目数据库使用的是sqlserver&#xff08;mssql&#xff09;&#xff0c;非mysql。 难点1:业主信息&#…...

Fast API使用

相关的代码上都有注释&#xff0c;其中前端代码是用来提交表单的 此代码进行了跨域处理&#xff0c;允许前端直接提交表单&#xff0c;并正常返回 完整代码&#xff1a; from typing import Unionfrom fastapi import Header, Cookie from pydantic import BaseModel, Field f…...

LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145056912 Llama 3 是 Meta 公司发布的开源大型语言模型&#xff0c;包括具有 80 亿和 700 亿参数的预训练和指令微调的语言模型&#xff0c;支持…...

MySQL 中删除重复数据 SQL 写法

要在 MySQL 中删除重复的数据并只保留一条&#xff0c;可以使用下面的方法&#xff08;要用的时候直接复制小改下条件和表名称即即可&#xff09; 方法一&#xff1a;使用 left join 子查询删除重复数据(推荐) 温馨提示&#xff1a;本人在 500w 数据下执行此 SQL 耗费 15s-30s…...

docker minio镜像arm64架构

minio版本为RELEASE.2021-09-03T03-56-13Z 原项目信创改造&#xff0c;服务器资源改为了arm64架构&#xff0c;统信uos docker镜像库内没有对应的minio镜像&#xff0c;当前镜像为拉取源码后&#xff0c;自编译打包镜像&#xff0c;亲测可用。 使用方式 将tar包导入到服务器…...

VUE3 监听器(watch)

在 Vue 3 中&#xff0c;监听器&#xff08;watch&#xff09;是用来观察响应式数据的变化&#xff0c;并在数据发生变化时执行相应操作的机制。watch 主要用于响应式数据变化时的副作用处理&#xff0c;比如异步操作、数据更新等。 1. 基础使用 在 Vue 3 中&#xff0c;watc…...

CAPL如何设置TCP/IP传输层动态端口范围

在TCP/IP协议中,应用程序通过传输层协议TCP/UDP传输数据,接收方传输层收到数据后,根据传输层端口号把接收的数据上交给正确的应用程序。我们可以简单地认为传输层端口号是应用程序的标识,这就是为什么我们说应用程序在使用TCP/IP协议通信时要打开传输层端口号或者绑定端口号…...

随记:有关Springboot项目中的时间格式实现的几种方式

1.注解 JsonFormat DateTimeFormat import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat;import java.time.LocalDateTime;public class Event {// 序列化和反序列化时生效JsonFormat(pattern "yyyy-MM…...

IntelliJ IDEA 优化设置

针对 Java 开发&#xff0c;IntelliJ IDEA 有许多优化设置&#xff0c;可以帮助提高代码编写、调试、构建和运行的效率。以下是一些针对 Java 开发的优化建议&#xff1a; 1. 增加 JVM 内存和性能优化 增加堆内存: 通过调整 idea.vmoptions 文件&#xff0c;增加 IntelliJ ID…...

jsp企业财务管理系统设计与实现

企业财务管理系统 摘要 对于企业集来说,财务管理的地位很重要。随着计算机和网络在企业中的广泛应用&#xff0c;企业发展速度在不断加快&#xff0c;在这种市场竞争冲击下企业财务管理系统必须优先发展&#xff0c;这样才能保证在竞争中处于优势地位。对此企业必须实现财务管理…...

EscherNet运行笔记

文章标题&#xff1a;EscherNet: A Generative Model for Scalable View Synthesis 1. 环境配置 conda env create -f environment.yml -n eschernet conda activate eschernet 2. 数据下载 wget https://tri-ml-public.s3.amazonaws.com/datasets/views_release.tar.gz 3…...

Java中的反射机制及其应用场景

目录 什么是Java反射机制&#xff1f; 工作原理 主要应用场景 注意事项 总结 什么是Java反射机制&#xff1f; Java反射机制是一种强大的工具&#xff0c;它允许程序在运行时访问、检查和修改其本身的类和对象的信息。通过反射&#xff0c;开发者可以在不知道类的具体实现…...

信息科技伦理与道德3:智能决策

1 概述 1.1 发展历史 1950s-1980s&#xff1a;人工智能的诞生与早期发展热潮 1950年&#xff1a;图灵发表了一篇划时代的论文&#xff0c;并提出了著名的“图灵测试”&#xff1b;1956年&#xff1a;达特茅斯会议首次提出“人工智能”概念&#xff1b;1956年-20世纪70年代&a…...

青少年编程与数学 02-006 前端开发框架VUE 16课题、组件基础

青少年编程与数学 02-006 前端开发框架VUE 16课题、组件基础 一、定义一个组件二、使用组件三、传递 props四、监听事件五、通过插槽来分配内容六、动态组件七、DOM 内模板解析注意事项1、大小写区分2、闭合标签3、元素位置限制 课题摘要:本文介绍了Vue.js中的组件基础&#xf…...

25/1/11 算法笔记 Yolov8物体识别

这几天做了给Yolov8检测物体的小任务&#xff0c;今天来做下总结。 首先介绍下整个Yolov8检测的步骤吧&#xff0c;安装库那些就不讲了。 这是我的文件包的对象树。 有images包&#xff0c;里面装了训练和验证的图像。 labels包&#xff0c;装了标注好的labels的txt文件&…...

水水水水水水

为了拿推广卷&#xff0c;但不想把我原本完整的文章拆成零散的多篇&#xff0c;只能出此下策随便发一篇&#xff0c;认真写的都笔记专栏里 网络技术&#xff1a;数字时代的基础设施 在当今社会&#xff0c;网络技术无疑是推动现代生活和经济发展的核心动力之一。从简单的信息传…...

XS5037C一款应用于专业安防摄像机的图像信号处理芯片,支持MIPI和 DVP 接口,内置高性能ISP处理器,支持3D降噪和数字宽动态

XS5037C是一款应用于专业安防摄像机的图像信号处理芯片&#xff0c;支持MIPI和 DVP 接口&#xff0c;最 大支持 5M sensor接入。内置高性能ISP处理器&#xff0c;支持3D降噪和数字宽动态。标清模拟输出支 持960H&#xff0c;高清模拟输出支持HDCCTV 720P/1080P/4M/5M。高度集成…...

机器学习无处不在,AI顺势而为,创新未来

机器学习无处不在&#xff1a; 1、推荐广告和搜索&#xff1a;推广搜不分家&#xff0c;属于数据科学中&#xff0c;对人的行为进行理解 2、计算机视觉CV&#xff1a;对人看到的东西进行理解 3、自然语言处理&#xff1a;对人交流的东西进行理解 4、数据挖掘和数据分析&…...

pandas处理json的相关操作

Pandas 是一个强大的数据处理库&#xff0c;它提供了丰富的功能来处理 JSON 数据。以下是 Pandas 中处理 JSON 的所有常见操作&#xff1a; 1. 读取 JSON 文件 使用 pandas.read_json() 函数可以从 JSON 文件或 JSON 字符串中读取数据。 从 JSON 文件读取 import pandas as …...

linux内存泄露定位过程(kmemleak和slab debug)

1&#xff0c;当遇到内存增加过多时&#xff0c;或者由于内存导致系统oom时我们怎么定位呢&#xff0c;定位时需要确认是内核态还是用户态内存泄露。 排查步骤 top查看VIRT和RES内存 rootubuntu2004:~# top top - 21:05:39 up 7 min, 1 user, load average: 5.01, 4.09, 2.…...

2025年安卓面试复习总结

文章目录 深入理解并熟练运用常用设计模式及反射原理&#xff0c;能够自定义注解及泛型&#xff0c;多次通过设计模式对 app 代码进行高效重构&#xff0c;显著提升代码的可维护性与扩展性。设计模式自定义注解泛型Kotlin泛型 精通多线程原理&#xff0c;对 ThreadPoolExecutor…...

JS scrollIntoView 技巧揭秘:解锁网页流畅交互

文章目录 一.基本概念二.语法和参数基本语法&#xff1a;element.scrollIntoView();参数详解&#xff1a; 三.应用场景和示例场景一&#xff1a;点击目录点位到相应的位置React 示例代码&#xff1a;Vue3 示例代码&#xff1a; 场景二&#xff1a;轮播图定位到指定图片示例代码…...

【Ubuntu 24.04】常见问题解决

1.24开启3D加速黑屏 参考文章&#xff1a;Ubuntu24开机黑屏&#xff0c;VMware卡死&#xff0c;虚拟机繁忙解决方案 没有3D加速就没有动画&#xff0c;所以我们需要开启3D加速&#xff0c;但是直接开启3D加速会黑屏 由于Ubuntu24内部的图形加速驱动异常&#xff0c;因此需要更新…...

前端依赖安装指南

前端依赖安装指南 一、NVM管理工具安装 1.在 Windows 上安装 下载 NVM for Windows 的安装程序&#xff1a;(最新版本可以在 nvm-windows Releases 页面 找到)运行下载的安装程序并按步骤操作。 2.配置 NVM exe安装自动配置环境变量 3. 验证 NVM 安装 验证 NVM 是否成功…...

重庆万州网站建设多少钱/黄页网推广服务

2.配置VTY(Virtual Teletype Terminal)虚拟终端接口的认证方式[H3C]user-interface vty 0 4[H3C-line-vty0-4]authentication-mode scheme//进行本地或远端用户名和口令认证。即AAA认证//关于认证&#xff0c;一共有三种认证方式//password 本地口令认证;//scheme 本地或远端用…...

wordpress主题著作权/百度商家平台登录

intitle 搜索网页中标题中函数有该文字的信息inurl  搜索路径中包含文字的信息alliurl  和inurl差不多,但是更精确filetype  搜索后缀名结尾的文件site    搜索制定域名的文件 转载于:https://www.cnblogs.com/52forjie/p/8682397.html...

医程通 网站做的太/网站及推广

洛谷 P2505 旅行 题解 洛谷 P2502 解题思路 将速度从小到大排 枚举断点 连接两个点 假如起点可到达终点 更新答案 输出记得化简 代码 #include<algorithm> #include<iostream> #include<cstdio> using namespace std; int xx,yy,ta,wo,n,m,s,t; double …...

山东省质量建设监督总站网站/百度知道合伙人官网

IDEA在一个模块下类文件如下图&#xff0c;对其进行单元测试时&#xff0c;没有运行窗口&#xff0c;毫无反应&#xff1b;可以发现在正常的java工程中是由run窗口的&#xff0c;可通过alt 4调出&#xff1b;但在该模块下&#xff0c;发现是这样的那么该怎么解决呢&#xff1f…...

做标识的网站 知乎/seo优质友链购买

安装了nodemon第三方库以后&#xff0c;使用nodemon .\01.helloworld.js命令&#xff0c;出现如下错误&#xff1a; 解决办法&#xff1a; 管理员身份打开powerShell 将鼠标定位到左下角“开始菜单”处&#xff0c;右键&#xff0c;选择“Windows PowerShell&#xff08;管理…...

绍兴市高速公路建设指挥部网站/今日头条新闻手机版

1 SWUpdata 概述 SWUpdata 是一个开源项目&#xff0c;该项目可以从存储介质或网络为嵌入式设备更新嵌入式系统。但是&#xff0c;它应该主要被视为一个框架&#xff0c;可以轻松地将更多协议或安装程序&#xff08;在 SWUpdate 中称为处理程序&#xff09;添加到应用程序中。 …...