C#实现观察者模式(Observer Pattern)的两种方式

下面我将详细讲解 "C#实现观察者模式(Observer Pattern)的两种方式" 的完整攻略,过程中会包含两条示例说明。

什么是观察者模式?

观察者模式(Observer Pattern)是一种设计模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知所有观察者对象,使得它们能够自动更新自己。

C#实现观察者模式的两种方式

在C#中,实现观察者模式有两种方式:利用事件机制和利用委托机制。下面我将分别介绍这两种方式以及它们的实现原理和示例。

利用事件机制实现观察者模式

利用事件机制实现观察者模式,需要使用C#中的“事件(event)”机制。事件是一种特殊的委托,它定义了一个事件源和事件处理函数,并提供了订阅和取消订阅事件的机制。

事件源是指观察的主题对象,事件处理函数则是指在主题对象状态改变时需要被执行的处理函数。当事件源状态改变时,所有与之关联的事件处理函数都会被自动执行,从而实现了观察者模式。

下面是利用事件机制实现观察者模式的示例代码:

// 主题对象
class Subject
{ 
    public event EventHandler StateChanged; // 定义状态改变事件

    private int _state;
    public int State 
    { 
        get { return _state; }
        set 
        {
            _state = value;
            if (StateChanged != null) // 触发状态改变事件
                StateChanged(this, EventArgs.Empty);
        }
    }
}

// 观察者对象
class Observer
{ 
    public Observer(Subject subject) 
    {
        subject.StateChanged += OnStateChanged; // 订阅状态改变事件
    }

    // 事件处理函数
    private void OnStateChanged(object sender, EventArgs e)
    {
        Console.WriteLine("Subject state changed to " + ((Subject)sender).State);
    }
}

// 示例代码
Subject subject = new Subject(); // 创建主题对象
Observer observer1 = new Observer(subject); // 创建观察者对象1并订阅主题对象的状态改变事件
Observer observer2 = new Observer(subject); // 创建观察者对象2并订阅主题对象的状态改变事件
subject.State = 1; // 改变主题对象的状态,触发状态改变事件,通知所有关联的观察者对象

在上述示例代码中,主题对象实现了状态改变事件,并在状态发生改变时触发该事件,通知所有订阅该事件的观察者对象。观察者对象则实现了事件处理函数,并在事件发生时自动被执行,完成相应的处理逻辑。

利用委托机制实现观察者模式

利用委托机制实现观察者模式,需要定义一个委托类型,该委托类型可以用于订阅状态改变事件,并在事件发生时自动执行相应的处理函数。主题对象在状态发生改变时,会调用所有订阅该委托类型的方法,完成观察者模式的实现。

下面是利用委托机制实现观察者模式的示例代码:

// 定义委托类型
delegate void StateChangedEventHandler(object sender, EventArgs e);

// 主题对象
class Subject
{ 
    private StateChangedEventHandler _stateChangedHandler;

    private int _state;
    public int State 
    { 
        get { return _state; }
        set 
        {
            _state = value;
            if (_stateChangedHandler != null) // 触发状态改变事件
                _stateChangedHandler(this, EventArgs.Empty);
        }
    }

    // 提供订阅和取消订阅状态改变事件的方法
    public void AddStateChangedHandler(StateChangedEventHandler handler)
    {
        _stateChangedHandler += handler;
    }

    public void RemoveStateChangedHandler(StateChangedEventHandler handler)
    {
        _stateChangedHandler -= handler;
    }
}

// 观察者对象
class Observer
{ 
    public Observer(Subject subject) 
    {
        subject.AddStateChangedHandler(OnStateChanged); // 订阅状态改变事件
    }

    // 事件处理函数
    private void OnStateChanged(object sender, EventArgs e)
    {
        Console.WriteLine("Subject state changed to " + ((Subject)sender).State);
    }
}

// 示例代码
Subject subject = new Subject(); // 创建主题对象
Observer observer1 = new Observer(subject); // 创建观察者对象1并订阅主题对象的状态改变事件
Observer observer2 = new Observer(subject); // 创建观察者对象2并订阅主题对象的状态改变事件
subject.State = 1; // 改变主题对象的状态,触发状态改变事件,通知所有关联的观察者对象

在上述示例代码中,主题对象通过定义一个委托类型来实现状态改变事件,并提供了订阅和取消订阅事件的方法。观察者对象则实现了事件处理函数,并在状态改变事件发生时自动被执行,完成相应的处理逻辑。

总结

以上就是利用C#实现观察者模式的两种方式的详细攻略。可以看到,两种方式都能够实现观察者模式,具体选择哪种方式,可以根据实际情况和个人喜好来决定。不过,需要注意的是,在使用委托机制时,需要自己手动定义委托类型,并提供订阅和取消订阅事件的方法,较为麻烦;而利用事件机制则能够更加简便地实现观察者模式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现观察者模式(Observer Pattern)的两种方式 - Python技术站

(1)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • Blazor UI库 Bootstrap Blazor 快速上手 (v7.5.7)

    最近组件库更新比较频繁,有些同学感觉有点迷茫,就着今天刚上了张老板一节课立马撸个新的上手教程回馈社区, ;-> 1.新建工程b18QuickStartv757,将项目添加到解决方案中 dotnet new blazorserver -o b18QuickStartv757 dotnet sln add b18QuickStartv757/b18Quic…

    C# 2023年4月27日
    00
  • C#预处理指令之#line,#pragma warning 详细解析

    C#预处理指令之#line,#pragma warning 详细解析 在C#中,预处理指令(Preprocessor directives)是以井号 (#) 开头的,用于控制编译过程的指令。预处理指令会在编译代码之前就被处理,与实际代码无关。这些指令用于给编译器提供附加的信息或指令,以执行不同的编译选项。 本文将详细讲解两条常用的预处理指令:#line 和 …

    C# 2023年6月1日
    00
  • 重温C# clr 笔记总结

    重温C# clr笔记总结攻略 1. 了解C#和clr的基本概念 C#是一种现代化的编程语言,而CLR是一种公共语言运行时环境,即Common Language Runtime。了解这两个基本概念,对于深入学习C#语言和如何使用它来构建.NET应用程序至关重要。 2. 熟悉C#和CLR的核心特点 C#和CLR有许多核心特点。这些特点对于掌握C#开发非常重要。例…

    C# 2023年5月15日
    00
  • PHP采集利器 Snoopy 试用心得

    PHP采集利器Snoopy试用心得 Snoopy是一款PHP采集工具,它可以模拟浏览器发送HTTP请求,获取网页内容,并对网页内容进行解析和处理。Snoopy具有简单易用、功能强大、支持Cookie、支持代理等特点,是PHP开发者进行网页采集和数据抓取的利器。在本文中,我们将介绍如何使用Snoopy进行网页采集,并提供两个示例。 步骤一:下载和安装Snoop…

    C# 2023年5月15日
    00
  • C#中FormClosing与FormClosed的区别详细解析

    C#是一种非常流行的编程语言,常被用于开发Windows上的桌面应用程序。在Windows窗体应用程序中,我们会经常使用到FormClosing和FormClosed事件来监测窗体关闭的状态。但是,许多人对这两个事件的具体区别并不是很清楚。在本文中,我们将详细讲解这两个事件的区别及其使用示例。 FormClosing事件 当Windows窗体应用程序正在关闭…

    C# 2023年6月8日
    00
  • .Net反向代理组件Yarp用法详解

    以下是“.Net反向代理组件Yarp用法详解”的完整攻略: 什么是Yarp Yarp(Yet Another Reverse Proxy)是一个开源的反向代理组件,由微软开发。它是一个轻量级、高性能、可扩展的反向代理组件,可以用于构建高性能的微服务网关、API网关等。 Yarp的特性 Yarp具有以下特性: 支持HTTP、HTTPS、WebSocket等协议…

    C# 2023年5月12日
    00
  • C#中的尾递归与Continuation详解

    C#中的尾递归与Continuation详解 什么是尾递归? 在递归调用中,当一个函数调用自己时,称为递归调用。如果这个递归函数中最后一步就是调用自身,并且这个调用的返回值直接作为当前的函数返回值,那么这个递归就是尾递归。例如下面这个基于斐波那契数列的递归函数: int Fibonacci(int n) { if(n == 0) return 0; if(n…

    C# 2023年6月7日
    00
  • C#获取机器码的方法详解(机器名,CPU编号,硬盘编号,网卡mac等)

    C#获取机器码的方法详解 在C#中,可以通过获取机器的特定信息来生成其唯一的机器码。具体可以获取的信息有机器名、CPU编号、硬盘编号、网卡mac等。下面我们分别介绍如何获取这些信息。 获取机器名 通过Environment.MachineName可以获取机器名,示例如下: string machineName = Environment.MachineNam…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部