C# 实现简单的观察者模式

简介: 简介:本文介绍了C#中三种常用设计模式的实现:观察者模式用于解耦主题与观察者,策略模式封装可互换的算法族,工厂模式则隐藏对象创建细节,提升代码可维护性与扩展性。

自定义观察者模式,实现主题和观察者的解耦,主题变化时通知所有观察者。

// 观察者接口
public interface IObserver
{
    void Update(string message);
}
// 主题接口
public interface ISubject
{
    void Attach(IObserver observer);
    void Detach(IObserver observer);
    void Notify(string message);
}
// 具体主题
public class NewsSubject : ISubject
{
    private readonly List<IObserver> _observers = new List<IObserver>();
    public void Attach(IObserver observer) => _observers.Add(observer);
    public void Detach(IObserver observer) => _observers.Remove(observer);
    public void Notify(string message)
    {
        foreach (var observer in _observers)
        {
            observer.Update(message);
        }
    }
}
// 具体观察者
public class UserObserver : IObserver
{
    private readonly string _userName;
    public UserObserver(string name) => _userName = name;
    public void Update(string message) => Console.WriteLine($"{_userName} 收到消息: {message}");
}
// 调用示例
public static void TestObserver()
{
    var news = new NewsSubject();
    news.Attach(new UserObserver("张三"));
    news.Attach(new UserObserver("李四"));
    news.Notify("C# 进阶教程已发布!");
}

49. C# 实现简单的策略模式

定义算法家族,封装每个算法,使它们可以互相替换,算法变化不影响客户端。

csharp

// 策略接口
public interface ISortStrategy
{
    void Sort(List<int> list);
}
// 冒泡排序策略
public class BubbleSort : ISortStrategy
{
    public void Sort(List<int> list)
    {
        Console.WriteLine("使用冒泡排序");
        for (int i = 0; i < list.Count - 1; i++)
        {
            for (int j = 0; j < list.Count - i - 1; j++)
            {
                if (list[j] > list[j + 1])
                {
                    (list[j], list[j + 1]) = (list[j + 1], list[j]);
                }
            }
        }
    }
}
// 快速排序策略
public class QuickSort : ISortStrategy
{
    public void Sort(List<int> list)
    {
        Console.WriteLine("使用快速排序");
        QuickSortInternal(list, 0, list.Count - 1);
    }
    private void QuickSortInternal(List<int> list, int left, int right)
    {
        // 快速排序实现逻辑
    }
}
// 上下文类
public class Sorter
{
    private ISortStrategy _strategy;
    public Sorter(ISortStrategy strategy) => _strategy = strategy;
    public void SetStrategy(ISortStrategy strategy) => _strategy = strategy;
    public void SortList(List<int> list) => _strategy.Sort(list);
}
// 调用示例
public static void TestStrategy()
{
    var list = new List<int> { 3, 1, 4, 1, 5, 9 };
    var sorter = new Sorter(new BubbleSort());
    sorter.SortList(list);
    sorter.SetStrategy(new QuickSort());
    sorter.SortList(list);
}

50. C# 实现简单的工厂模式

通过工厂类封装对象的创建逻辑,客户端无需直接实例化具体类。

相关文章
|
5月前
|
C#
C# 实现简单的 Excel 数据写入工具
基于EPPlus库实现C#将数据写入Excel文件,支持自定义表头与多行数据,自动调整列宽,操作简便,适用于非商业场景的数据导出需求。
|
5月前
|
C#
C# 异常处理:try-catch-finally 避免程序崩溃
异常处理用于捕获运行时错误(如空引用、文件不存在),确保程序稳定。通过 `try` 包裹可能出错的代码,`catch` 捕获并处理异常,`finally` 确保资源释放等操作始终执行,提升代码健壮性。
|
5月前
|
存储 C#
C# 实现简单的备忘录模式
备忘录模式在不破坏封装性的前提下,捕获并保存对象的内部状态,以便后续恢复。通过原发器创建备忘录,管理者存储备忘录,可实现状态回滚。
|
5月前
|
C#
C# 条件判断:if-else 与 switch 的实用场景
条件判断是流程控制的核心。if-else适用于多级条件判断,如根据积分决定会员等级;switch适用于多值匹配,C# 7.0+支持字符串和数值匹配,可清晰处理会员等级对应的优惠策略。
|
5月前
|
安全 C#
C# 实现简单的单例模式(懒汉式)
单例模式确保一个类仅存在一个实例,并提供全局访问点。通过私有构造函数防止外部实例化,结合静态属性和延迟初始化实现线程安全的唯一实例,常用于日志、配置管理等场景。
|
Oracle 关系型数据库 Linux
oracle 12c install for linux
操作系统: rhel-server-6.4-x86_64-dvd.iso 数据库版本:linuxamd64_12c_database_1of2.zip;linuxamd64_12c_database_2of2.
1497 0
|
供应链 API 开发者
解锁电商数据的无限可能:探秘京东商品SKU信息API接口
京东商品SKU信息API接口是电商开发与运营中的重要工具,帮助开发者获取商品的详细属性,如库存、价格、规格等。通过该接口,电商平台可以丰富商品展示页面,提升用户体验;商家能实时掌握库存动态,优化销售策略;数据分析人员可深入洞察市场趋势,实现精准营销。使用前需注册京东开放平台账号、创建应用并获取API权限,同时仔细阅读API文档以确保正确调用。代码示例展示了如何用Python调用该接口,并处理返回数据。未来,该接口将在个性化推荐、智能库存管理和数据分析等领域发挥更大作用,助力电商业务创新与发展。
1063 14
|
5月前
|
存储 开发框架 缓存
C# 实现图片验证码的 WebAPI 版(ASP.NET Core)
基于ASP.NET Core实现的验证码服务,生成带干扰线和随机旋转文字的4位图文验证码,支持内存存储与验证。需安装System.Drawing.Common包。
|
5月前
|
JSON C# 数据格式
C# 实现简单的 HTTP 请求工具(POST 补充)
该代码实现了一个基于 HttpClient 的异步 HTTP POST 请求工具类,支持以 JSON 格式提交数据并反序列化响应结果,具备异常处理机制,适用于 .NET 环境下的轻量级网络请求操作。
|
5月前
|
存储 数据库连接 C#
C# 配置文件读取:App.config 用法
App.config用于存储程序配置(如数据库连接、接口地址),避免硬编码,提升可维护性。通过ConfigurationManager读取配置,支持字符串、整型、布尔值及连接字符串的获取,需引用System.Configuration程序集。