首页 > 其他分享 >重温设计模式 --- 观察者模式

重温设计模式 --- 观察者模式

时间:2023-07-09 14:11:40浏览次数:29  
标签:count observer void 重温 观察者 --- IObserver 设计模式 public

引言

观察者模式是一种行为型设计模式,它允许对象之间建立一种一对多的关系,使得当一个对象状态改变时,所有依赖它的对象都能够自动得到通知并更新自己的状态。该模式可以帮助我们实现松耦合的系统,以便更好地应对变化和扩展。

在观察者模式中,有两个角色:观察者被观察者。被观察者负责维护观察者列表,并在状态发生改变时通知观察者;观察者则负责接收被观察者的通知并进行相应的处理。

下面我们通过一个简单的例子来说明观察者模式的用法。假设我们要实现一个计数器,每次计数器增加时需要通知所有的观察者。

观察者

先定义一个接口IObserver,用于定义观察者的行为,该接口只有一个方法Update,用于接收被观察者的通知并更新观察者的状态。

public interface IObserver
{
    void Update(int count);
}

再定义一个观察者实现ConsoleObserver,它负责在控制台上输出计数器的值。

public class ConsoleObserver : IObserver
{
    public void Update(int count)
    {
        Console.WriteLine($"Count = {count}");
    }
}

被观察者

定义一个被观察者Counter,它负责维护观察者列表,并在计数器增加时通知观察者。

public class Counter
{
    private int count = 0;
    private List<IObserver> observers = new List<IObserver>();

    public void AddObserver(IObserver observer)
    {
        observers.Add(observer);
    }

    public void RemoveObserver(IObserver observer)
    {
        observers.Remove(observer);
    }

    public void Increment()
    {
        count++;
        NotifyObservers();
    }

    private void NotifyObservers()
    {
        foreach (IObserver observer in observers)
        {
            observer.Update(count);
        }
    }
}

然后可以定义一个观察者ConsoleObserver,一个被观察者Counter,再计数器增加时,通知ConsoleObserver输出到控制台。

Counter counter = new Counter();

IObserver consoleObserver = new ConsoleObserver();

counter.AddObserver(consoleObserver);

counter.Increment();

控制台得到输出Count = 1

结论

观察者模式广泛应用于GUI(图形用户界面)开发、事件驱动系统、消息通知系统、进程间通信等场景中。

它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,所有依赖于它的观察者对象都会得到通知并自动更新。

观察者模式的作用是将系统中的关注点分离,提高系统的可维护性、扩展性和重用性。通过该模式,主题对象和观察者对象之间的耦合度降低,让它们之间的关系更加松散,从而使系统更加灵活、可扩展和易于维护。

标签:count,observer,void,重温,观察者,---,IObserver,设计模式,public
From: https://www.cnblogs.com/pandefu/p/17536309.html

相关文章

  • 滑动验证码-编辑移动轨迹
    滑动验证码-编辑移动轨迹思路:建立每次移动的距离,使用时,移动获取距离拖动滑块儿即可。提示滑动的距离不能随意设置,需要复合人类行为。推荐参考,高中物理了解过的知识:均变速直线运动的速度与时间关系的公式:V=V0+at均变速直线运动的位移与时间关系的公式:x=v0t+½at²'''1、......
  • AI绘画:StableDiffusion炼丹Lora攻略-实战萌宠图片生成
    写在前面的话近期在小红书发现了许多极其可爱、美观的萌宠图片,对这些美妙的图像深深着迷于是想着看看利用AI绘画StableDiffusion以下简称(SD)做出来。以下是详细实操的全过程,包括所有用的资料已经打包到网盘。最后尝试的最终效果如下:更多图片请查看网盘:「萌宠图片及关键词」......
  • 面试类-Java基础 (三)
    String是Java基本数据类型吗?可以被继承吗?String是Java基本数据类型吗?不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitivetype),剩下的都是引用类型(referencetype)。String是一个比较特殊的引用数据类型......
  • JVM垃圾收集器(三) ------ 垃圾回收器(一)
    垃圾回收器分类按照线程数分• 串行垃圾回收器• 同一段时间内只允许一个CPU执行垃圾回收的操作,此时工作线程暂停,直至垃圾收集工作结束• 单CPU或者较小的应有等内存硬件平台不是特别优越的场合,串行回收器的表现就可以超过所并行回收器和并发回收器• 串行回收器默认应有在客......
  • IoTOS-v1.2.1接入J-IM(t-io)后台通知App
    IoTOS v1.2.1         一、登录页增加可修改轮播     登录页增加可修改数据轮播:首页轮播图由背景图片、标题、介绍、按钮一、按钮二(可配置跳转地址打开方式)组合而成  二、登录页增加常用运营商平台&关于-IoTOS链接    登录页增加国内常......
  • vue-day10--键盘事件
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>Document</title><script......
  • 重温设计模式 --- 抽象工厂模式
    引言抽象工厂模式一种创建型设计模式,它提供了一种方式来封装一组具有相同主题的工厂,而不必指定它们具体的类。这样,客户端代码就可以使用抽象工厂来创建一组相关的对象,而不必关心实际创建的具体类。抽象工厂模式有以下几个主要角色:抽象工厂(AbstractFactory):声明用于创建抽象产......
  • springcloud - zipkin链路调用
     通过sleuth,开启zipkin可通过访问localhost:9411/zipkin开启web界面查看链路调用traceid就是一个服务idparentid就是调用者的id原始服务parentid=null服务提供者provider导入依赖     <!--包含了sleuth+zipkin-->     <dependency>   ......
  • 1-快速上手SpringBoot
    1.SpringBoot入门程序制作(一)【idea联网版】步骤①:创建新模块,选择SpringInitializr,并配置模块相关基础信息特别关注:第3步点击Next时,Idea需要联网状态才可以进入到后面那一页,如果不能正常联网,就无法正确到达右面那个设置页了,会一直联网转圈特别关注:第5步选择java......
  • vue-day9--事件修饰符
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width,initial-scale=1.0"/><title>Document</title><script......