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# 实现简单的工厂模式

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

相关文章
|
2天前
|
C#
C# 条件判断:if-else 与 switch 的实用场景
条件判断是流程控制的核心。if-else适用于多级条件判断,如根据积分决定会员等级;switch适用于多值匹配,C# 7.0+支持字符串和数值匹配,可清晰处理会员等级对应的优惠策略。
|
2天前
|
存储 C#
C# 实现简单的备忘录模式
备忘录模式在不破坏封装性的前提下,捕获并保存对象的内部状态,以便后续恢复。通过原发器创建备忘录,管理者存储备忘录,可实现状态回滚。
|
2天前
|
安全 C#
C# 实现简单的单例模式(懒汉式)
单例模式确保一个类仅存在一个实例,并提供全局访问点。通过私有构造函数防止外部实例化,结合静态属性和延迟初始化实现线程安全的唯一实例,常用于日志、配置管理等场景。
|
2天前
|
C#
C# 实现简单的 Excel 数据写入工具
基于EPPlus库实现C#将数据写入Excel文件,支持自定义表头与多行数据,自动调整列宽,操作简便,适用于非商业场景的数据导出需求。
|
2天前
|
C#
C# 异常处理:try-catch-finally 避免程序崩溃
异常处理用于捕获运行时错误(如空引用、文件不存在),确保程序稳定。通过 `try` 包裹可能出错的代码,`catch` 捕获并处理异常,`finally` 确保资源释放等操作始终执行,提升代码健壮性。
|
2天前
|
C#
C# 字符串操作:常用方法汇总(含案例)
C# 提供丰富的字符串操作方法,如拼接、截取、替换和判断等。本文通过工具类案例演示如何高效处理字符串,提升开发效率与代码可读性。
|
2天前
|
C#
C# 日期时间操作:格式化与计算
DateTime类用于处理日期时间操作,支持格式化输出、加减计算及获取特定日期(如本月第一天)。示例代码展示了常用功能:格式化、计算日期差、增减天数等,便于高效处理时间数据。
|
2天前
|
JSON C# 数据格式
C# 实现简单的 HTTP 请求工具(POST 补充)
该代码实现了一个基于 HttpClient 的异步 HTTP POST 请求工具类,支持以 JSON 格式提交数据并反序列化响应结果,具备异常处理机制,适用于 .NET 环境下的轻量级网络请求操作。
|
2天前
|
算法 C# 容器
C# 实现简单的迭代器模式
迭代器模式提供一种顺序访问聚合对象元素的方法,无需暴露其内部结构。通过定义统一的迭代接口,实现对不同集合的遍历操作,增强容器的封装性和算法的复用性。
|
2天前
|
C#
C# 实现发送邮件功能(SMTP)
通过SMTP协议实现邮件发送,支持文本与附件,需配置邮箱SMTP信息(如QQ邮箱授权码)。示例代码展示C#中如何使用SmtpClient发送邮件,适用于QQ、163、Gmail等主流邮箱服务。

热门文章

最新文章