首页 > 编程语言 > C#设计模式15——观察者模式的写法

C#设计模式15——观察者模式的写法

时间:2023-05-09 22:36:13浏览次数:29  
标签:15 C# void 观察者 Update 对象 IObserver 设计模式 public

是什么:

观察者模式是一种设计模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象状态发生改变时,它的所有依赖者都能够得到相应的通知并作出相应的反应。观察者模式也被称为发布-订阅模式。

为什么:

观察者模式可以实现对象之间的松耦合,从而使得对象更容易扩展和维护。同时,它也可以帮助我们实现一些实时通信的需求,如事件驱动的程序等。

怎么做:

在C#中,可以通过接口和委托来实现观察者模式。具体的做法是,定义一个接口,包含一个Update()方法,表示观察者需要在被通知时执行的操作;然后,在被观察者对象中定义一个List<IObserver>类型的观察者列表,每个观察者对象实现IObserver接口中的Update()方法,被观察者对象可以通过遍历观察者列表,并依次调用Update()方法来通知所有观察者对象。

何时用:

观察者模式常用于以下场景:

1.在多个对象之间需要有一种一对多的依赖关系,并且不希望关键对象和被依赖对象之间存在强耦合关系。

2.需要实现实时通信,如事件驱动的程序等。

3.需要通知多个对象,但又不知道这些对象的确切数量和类型时。

4.需要将各个对象解耦开来,使得它们的改动不会影响到其他对象。

如何实现:

在C#中,使用观察者模式的关键是要定义一个接口,包含一个Update()方法。这个方法表示观察者需要在被通知时执行的操作。

接口代码示例:

//观察者接口
public interface IObserver
{
    void Update();
}

然后,在被观察者对象中定义一个List<IObserver>类型的观察者列表,并提供添加删除观察者的方法。被观察者对象的代码示例:

//被观察者抽象类
public abstract class Subject
{
    private 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()
    {
        foreach (var observer in _observers)
        {
            observer.Update();
        }
    }
}

在被观察者抽象类中,定义了一个观察者列表,以及添加、移除观察者和通知观察者列表中的观察者的方法。

最后,具体的观察者对象需要实现IObserver接口中的Update()方法,以便在被通知时能够执行相应的操作。观察者对象的代码示例:

//具体观察者类1
public class ConcreteObserverA : IObserver
{
    public void Update()
    {
        Console.WriteLine("ConcreteObserverA received the message.");
    }
}

//具体观察者类2
public class ConcreteObserverB : IObserver
{
    public void Update()
    {
        Console.WriteLine("ConcreteObserverB received the message.");
    }
}

最后,我们可以在客户端中创建具体的被观察者对象和观察者对象,并将观察者对象添加到被观察者对象的观察者列表中,从而实现观察者模式的功能。

客户端代码示例:

class Client
{
    static void Main(string[] args)
    {
        //创建被观察者对象
        Subject subject = new ConcreteSubject();

        //创建两个具体观察者对象并添加到被观察者对象的观察者列表中
        IObserver observerA = new ConcreteObserverA();
        IObserver observerB = new ConcreteObserverB();

        subject.Attach(observerA);
        subject.Attach(observerB);

        //被观察者对象的状态改变,通知观察者对象
        subject.ChangeState();
        subject.Notify();
    }
}

输出结果:

```
The subject's state has been changed.
ConcreteObserverA received the message.
ConcreteObserverB received the message.
```

标签:15,C#,void,观察者,Update,对象,IObserver,设计模式,public
From: https://www.cnblogs.com/for-easy-fast/p/17386506.html

相关文章

  • Transformer 模型中的positional encoding(位置编码)计算理解(2)
            以下(以上)内容来自(参考):https://www.bilibili.com/video/BV1Di4y1c7Zm?p=2&vd_source=6292df769fba3b00eb2ff1859b99d79e  importnumpyasnpdefgetPositionEncoding(seq_len,dim,n=10000):##seq_len:序列长度##dim词向量的维......
  • 现代 C++:Lambda 表达式
    Lambda表达式(LambdaExpression)是C++11引入的一个“语法糖”,可以方便快捷地创建一个“函数对象”。从C++11开始,C++有三种方式可以创建/传递一个可以被调用的对象:函数指针仿函数(Functor)Lambda表达式函数指针函数指针是从C语言老祖宗继承下来的东西,比较原始,功能也比......
  • 第五章学习 循环结构,分支结构,break,continue,return的用法,接收用户数据的fmt.scanl
       packagemainimport"fmt"funcmain(){//实现功能,键盘录入学生age,name,grage,是否为vipvarageintfmt.Println("请录入年龄")//传入age地址的目的:scanln函数中,对地址的值进行改变,实际上是对age值进行改变fmt.Scanln(&age)varname......
  • Docker部署网易云音乐解灰无版权VIP音乐播放下载
    若服务器已搭建好Docker,则跳过输入搭建docker命令,回车执行,耐心等待安装完成curl-fsSLhttps://get.docker.com|bash-sdocker--mirrorAliyun执行一键部署命令dockerrun-dit\ -eENABLE_FLAC=true\ -eENABLE_LOCAL_VIP=svip\ -eBLOCK_ADS=true\ -eSEARCH_A......
  • C++ Lambda表达式的完整介绍
    c++在c++11标准中引入了lambda表达式,一般用于定义匿名函数,使得代码更加灵活简洁。lambda表达式与普通函数类似,也有参数列表、返回值类型和函数体,只是它的定义方式更简洁,并且可以在函数内部定义。什么是Lambda表达式最常见的lambda的表达式写法如下autoplus=[](intv1,int......
  • C++11 lambda表达式精讲
    lambda表达式是C++11最重要也最常用的一个特性之一,C#3.5和Java8中就引入了lambda表达式。 lambda来源于函数式编程的概念,也是现代编程语言的一个特点。C++11这次终于把lambda加进来了。 lambda表达式有如下优点:声明式编程风格:就地匿名定义目标函数或函数对......
  • 学生CPP成绩计算
     一、问题描述。    计算学生的CPP成绩二、设计思路。定义下面的人员基类框架:classPerson{protected:stringname;intage; public:Person();Person(stringp_name,intp_age);voiddisplay(){cout<<name<<“:”<<age<......
  • CSS对文本框的修饰
    CSS对文本框的修饰这是我们常用的文本框,第一个是普通的样式,第二个是只有背景颜色的文本框,第三个是把文本框的四个边变成黑色的样式,第四个是把上边框、左右边框定义与背景颜色的样式,像一个填空题:)这是怎么实现的呢?下面我将依次介绍。(1)普通文本框代码如下:(实际上就是我们常用的)<i......
  • Django笔记二十三之case、when操作条件表达式搜索、更新等操作
    本文首发于公众号:Hunter后端原文链接:Django笔记二十三之条件表达式搜索、更新等操作这一篇笔记将介绍条件表达式,就是如何在model的使用中根据不同的条件筛选数据返回。这个操作类似于数据库中ifelifelse的逻辑。以下是本篇笔记的目录:model和数据准备When和Case......
  • 3-10 编写函数把华氏温度转换为摄氏温度,公式为:C=5/9(F-32),在主程序中提示用户输入一个华
    设计思路:c++函数的定义、引用以及c++语言运算的规则 代码:#include<iostream>usingnamespacestd;floatf(floata){floatx=5.0/9*(a-32);returnx;}intmain(){floatf(floata);floata;cin>>a;floatn;n=f(a);cout<<n;}总结:函数的定义与......