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

C# 中常见的设计模式

设计模式是一套被广泛应用于软件设计的最佳实践,它们可以帮助开发者解决特定的问题,提高代码的可重用性、可读性和可维护性。本文将介绍 C#
中常见的几种设计模式,并提供相应的示例代码。

  • 工厂模式

工厂模式是一种创建型设计模式,它提供了一种将对象的创建过程与使用过程分离的方式。它通过定义一个工厂类,使得客户端代码可以从工厂类中获取所需的对象,而无需知道对象的具体创建过程。

以下是工厂模式的一个示例:

public interface IProduct
{void DoSomething();
}public class ProductA : IProduct
{public void DoSomething(){Console.WriteLine("ProductA does something.");}
}public class ProductB : IProduct
{public void DoSomething(){Console.WriteLine("ProductB does something.");}
}public class ProductFactory
{public IProduct CreateProduct(string type){switch (type){case "A":return new ProductA();case "B":return new ProductB();default:throw new ArgumentException("Invalid product type");}}
}class Program
{static void Main(string[] args){ProductFactory factory = new ProductFactory();IProduct productA = factory.CreateProduct("A");IProduct productB = factory.CreateProduct("B");productA.DoSomething();productB.DoSomething();Console.ReadKey();}
}

在上面的示例中,我们定义了 IProduct 接口和两个实现类 ProductA 和 ProductB。然后,我们定义了一个工厂类 ProductFactory,它可以根据客户端代码传入的参数创建不同的产品对象。

在客户端代码中,我们实例化了 ProductFactory 并通过它创建了两个不同的产品对象。这种方式可以使得客户端代码不需要知道对象的具体创建过程,从而提高了代码的可重用性和可维护性。

  • 单例模式

单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供了全局访问该实例的方式。

以下是单例模式的一个示例:

public class Singleton
{private static Singleton instance;private Singleton() { }public static Singleton Instance{get{if (instance == null){instance = new Singleton();}return instance;}}public void DoSomething(){Console.WriteLine("Singleton does something.");}
}class Program
{static void Main(string[] args){Singleton singleton = Singleton.Instance;singleton.DoSomething();Console.ReadKey();}
}

在上面的示例中,我们定义了一个 Singleton 类,并通过将构造函数私有化来防止外部直接实例化它。然后,我们定义了一个静态字段 instance,用来保存 Singleton 类的唯一实例。我们还定义了一个静态属性 Instance,通过它来获取 Singleton 类的唯一实例。

在客户端代码中,我们通过 Singleton.Instance 获取 Singleton 类的唯一实例,并调用它的 DoSomething 方法。由于 Singleton 类只有一个实例,因此多次调用 Singleton.Instance 得到的都是同一个实例。

  • 观察者模式

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听某个主题对象的状态变化。

以下是观察者模式的一个示例:

public interface IObserver
{void Update(string message);
}public interface ISubject
{void RegisterObserver(IObserver observer);void RemoveObserver(IObserver observer);void NotifyObservers(string message);
}public class Subject : ISubject
{private List<IObserver> observers = new List<IObserver>();public void RegisterObserver(IObserver observer){observers.Add(observer);}public void RemoveObserver(IObserver observer){observers.Remove(observer);}public void NotifyObservers(string message){foreach (IObserver observer in observers){observer.Update(message);}}
}public class Observer : IObserver
{public void Update(string message){Console.WriteLine($"Observer received message: {message}");}
}class Program
{static void Main(string[] args){Subject subject = new Subject();Observer observer1 = new Observer();Observer observer2 = new Observer();subject.RegisterObserver(observer1);subject.RegisterObserver(observer2);subject.NotifyObservers("Hello, observers!");subject.RemoveObserver(observer2);subject.NotifyObservers("Hello again, observers!");Console.ReadKey();}
}

在上面的示例中,我们定义了 IObserver 和 ISubject 接口,分别表示观察者和主题对象。然后,我们实现了 Subject 类,它实现了 ISubject 接口,并提供了注册观察者、移除观察者和通知观察者的方法。我们还实现了 Observer 类,它实现了 IObserver 接口,并在 Update 方法中打印出接收到的消息。
在客户端代码中,我们创建了一个 Subject 对象和两个 Observer 对象,并通过 RegisterObserver 方法将这两个观察者对象注册到 Subject 对象上。然后,我们调用 NotifyObservers 方法,将消息发送给所有注册的观察者对象。最后,我们通过 RemoveObserver 方法移除了一个观察者对象,并再次调用 NotifyObservers 方法发送消息给剩下的观察者对象。

  • 策略模式

策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法都封装起来,并且使它们之间可以互换。

以下是策略模式的一个示例:

public interface IStrategy
{void Execute();
}public class StrategyA : IStrategy
{public void Execute(){Console.WriteLine("Strategy A is executed.");}
}public class StrategyB : IStrategy
{public void Execute(){Console.WriteLine("Strategy B is executed.");}
}public class Context
{private IStrategy strategy;public Context(IStrategy strategy){this.strategy = strategy;}public void SetStrategy(IStrategy strategy){this.strategy = strategy;}public void ExecuteStrategy(){strategy.Execute();}
}class Program
{static void Main(string[] args){IStrategy strategyA = new StrategyA();IStrategy strategyB = new StrategyB();Context context = new Context(strategyA);context.ExecuteStrategy();context.SetStrategy(strategyB);context.ExecuteStrategy();Console.ReadKey();}
}

在上面的示例中,我们定义了 IStrategy 接口,表示一个算法的接口。然后,我们实现了两个具体的策略类 StrategyA 和 StrategyB,它们分别实现了 IStrategy 接口。最后,我们定义了 Context 类,它包含一个 IStrategy 类型的字段和一个 ExecuteStrategy 方法,通过它来执行当前策略对象的算法。Context 类还提供了一个 SetStrategy 方法,用于在运行时切换策略对象。

在客户端代码中,我们创建了一个 Context 对象,并将 StrategyA 对象作为它的构造参数。然后,我们调用 ExecuteStrategy 方法,执行 StrategyA 的算法。接着,我们调用 SetStrategy 方法,将策略对象切换为 StrategyB,再次调用 ExecuteStrategy 方法,执行 StrategyB 的算法。

以上是 C# 中几种常见的设计模式以及相应的示例代码。

相关文章:

C# 中常见的设计模式

设计模式是一套被广泛应用于软件设计的最佳实践&#xff0c;它们可以帮助开发者解决特定的问题&#xff0c;提高代码的可重用性、可读性和可维护性。本文将介绍 C# 中常见的几种设计模式&#xff0c;并提供相应的示例代码。 工厂模式 工厂模式是一种创建型设计模式&#xff0c…...

promethues/servicemonitor

目录 1.promethues 能保证源源不断地采集/metrics 信息吗&#xff1f;每次都是最新的吗 2.部署servicemonitor 的作用是什么&#xff1f; 3.pod 部署采集数据直接上报promthues &#xff0c;不通过servicemonitor 可以吗&#xff1f; 4.你说的"此外&#xff0c;如果部署…...

postman使用简介

1、介绍 postman是一款功能强大的网页调试和模拟发送HTTP请求的Chrome插件&#xff0c;支持几乎所有类型的HTTP请求 2、下载及安装 官方文档&#xff1a;https://www.getpostman.com/docs/v6/ chrome插件&#xff1a;chrome浏览器应用商店直接搜索添加即可&#xff08;需墙&…...

@DS注解在事务中实现数据源的切换@DS在事务中失效【已解决】

在Springboot的application.yml中的配置&#xff1a; spring:datasource:url: jdbc:mysql://localhost:3306/test2?serverTimezoneUTC&useUnicodetrue&characterEncodingutf8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: rootdynamic:primar…...

Java I/O之文件系统

一、全文概览 在学习文件系统之前&#xff0c;需要了解下Java在I/O上的发展史&#xff1a;在Java7之前&#xff0c;打开和读取文件需要编写特别笨拙的代码&#xff0c;涉及到很多的InputStream、OutputStream等组合起来使用&#xff0c;每次在使用时或许都需要查一下文档才能记…...

Mysql元数据获取方法(information_schema绕过方法)

前提&#xff1a;如果waf或其它过滤了information_schema关键字&#xff0c;那我们该如何获取元数据呢&#xff1f;能够代替information_schema的有&#xff1a;sys.schema_auto_increment_columnssys.schema_table_statistics_with_bufferx$schema_table_statistics_with_buff…...

Eclipse快捷键

* 1.补全代码的声明&#xff1a;alt /* 2.快速修复: ctrl 1 * 3.批量导包&#xff1a;ctrl shift o* 4.使用单行注释&#xff1a;ctrl /* 5.使用多行注释&#xff1a; ctrl shift / * 6.取消多行注释&#xff1a;ctrl shift \* 7.复制指定行的代码&#xff1a;ctrl a…...

java ssm自习室选座预约系统开发springmvc

人工管理显然已无法应对时代的变化&#xff0c;而自习室选座预约系统开发能很好地解决这一问题&#xff0c;既能提高人力物力&#xff0c;又能提高预约选座的知名度&#xff0c;取代人工管理是必然趋势。 本自习室选座预约系统开发以SSM作为框架&#xff0c;JSP技术&#xff0c…...

分享我从功能测试转型到测试开发的真实故事

由于这段时间我面试了很多家公司&#xff0c;也经历了之前公司的不愉快。所以我想写一篇文章来分享一下自己的面试体会。希望能对我在之后的工作或者面试中有一些帮助&#xff0c;也希望能帮助到正在找工作的你。 找工作 我们总是草率地进入一个自己不了解的公司工作&#xf…...

TypeScript快速入门———(二)TypeScript常用类型

文章目录概述1 类型注解2 常用基础类型概述3.原始类型4 数组类型5 类型别名6.函数类型7 对象类型8 接口9 元组10 类型推论11 类型断言12 字面量类型13 枚举14 any 类型15 typeof概述 TypeScript 是 JS 的超集&#xff0c;TS 提供了 JS 的所有功能&#xff0c;并且额外的增加了…...

Mac M1 使用Centos8➕VMware Fusion进行静态网络配置

大部分的流程网络上面都有当我们已经下载好mac m1版的Centos8链接: https://pan.baidu.com/s/1UTl4Lo-_c17s-PDj3dA6kA 提取码: 7xh2 和VMware Fusionhttps://www.vmware.com/cn/products/fusion.html之后就可以进行安装了在导入过后 记得将硬盘和内存都设置好了 记得在关机状态…...

RadGraph: Extracting Clinical Entities and Relations from Radiology Reports代码

文章来源&#xff1a;NeurIPS 文章类别&#xff1a;IE(Information Extraction) RadGraph主要基于dygie&#xff0c;主要文件为inference.py。 inference.py&#xff1a; 1、get_file_list(data_path) def get_file_list(path):file_list [item for item in glob.glob(f&q…...

13. OPenGL与QT界面元素交互控制图形渲染

1. 说明&#xff1a; 前面文章中讲到的 OPenGL 渲染都是在页面加载完成即立刻渲染的&#xff0c;如果向控制图形渲染的时间&#xff0c;可以在QT界面中添加一些元素来进行控制。此时需要用到OPenGL当中的makeCurrent(),update(),doneCurrent()函数。 效果展示&#xff1a; ope…...

高通平台开发系列讲解(USB篇)libuvc详解

文章目录 一、什么是UVC二、UVC拓扑结构三、libuvc的预览时序图沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍libuvc。 一、什么是UVC UVC,全称为:USB video(device) class。 UVC是微软与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标…...

ICC2:set_route_opt_target_endpoints

route_opt阶段通过指定endpoint/driver pin list的方式执行incremental优化。 set_route_opt_target_endpoints [-setup_endpoints file] [-setup_endpoints_collection pin_list] [-hold_endpoints file] [-hold_endpoints_collection pin_list] [-ldrc_objects fil…...

5、小程序面试题

1, 小程序页面有哪些生命周期函数onLoad: 页面加载onReady: 页面初次渲染完成onShow: 页面显示onHide: 页面隐藏onUnload: 页面卸载2, 一页小程序页面有哪些文件组成,分别有什么作用.wxml: 使用微信框架设计的一套组件构建页面结构.wxss: 用于设置页面样式, 和css基本一致.js :…...

Java特殊操作流

6 特殊操作流 6.1 标注输入输出流 System类中有两个静态的成员变量&#xff1a; public static final InputStream in&#xff1a;标准输入流&#xff0c;通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源public static final PrintStream out&#xff1a;标准输…...

如何用SCRM销售管理系统管理销售和做销售管理

每一家企业都在找适合自己公司的销售管理方法&#xff0c;实现销售目标和努力提高业绩。 我们常说&#xff0c;做好销售管理有很多路径和方法&#xff0c;但我们不知道从哪里开始&#xff1f;每个阶段我们该怎么办&#xff1f;如何有效管理销售团队&#xff1f;好的企企业微信…...

分享117个HTML婚纱模板,总有一款适合您

分享117个HTML婚纱模板&#xff0c;总有一款适合您 117个HTML婚纱模板下载链接&#xff1a;https://pan.baidu.com/s/1cC3I5cfh91-KmQj4nfSoPA?pwd9hod 提取码&#xff1a;9hod Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 import os import shutil import …...

VIVADO2022 sdk 工程创建流程

正点原子uart历程复现 create block design&#xff08;起名 为System&#xff09; -> open block design -> 号/IP catalog 中搜索zynq 双击打开&#xff0c; 将和pl相关的时钟都干掉 再auto 布线一下 把herarchy中的sources 中的system.bd右键、 无脑下一步导出 如…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...