iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一起来学习C#的观察者模式
  • 680
分享到

一起来学习C#的观察者模式

2024-04-02 19:04:59 680人浏览 八月长安
摘要

using System; using System.Collections.Generic; public class Example { public static vo

using System;
using System.Collections.Generic;
public class Example
{
    public static void Main()
    {
        BaggageHandler provider = new BaggageHandler();
        ArrivalsMonitor observer1 = new ArrivalsMonitor("BaggageClaimMonitor1");
        ArrivalsMonitor observer2 = new ArrivalsMonitor("SecurityExit");
        // 添加信息,此时没有观察者,对于新的信息不会进行操作,若有观察者,则对观察者内部数据进行对比,若有新内容则进行更新。
        provider.BaggageStatus(712, "Detroit", 3);
        // 添加了观察者,观察者内部也有数据集。新信息传进来,会与内部数据集进行对比,若有新内容则进行更新。
        observer1.Subscribe(provider);
        provider.BaggageStatus(712, "Kalamazoo", 3);
        provider.BaggageStatus(400, "New York-Kennedy", 1);
        provider.BaggageStatus(712, "Detroit", 3);
        observer2.Subscribe(provider);
        provider.BaggageStatus(511, "San Francisco", 2);
        //参数3为0 执行移除712对应信息值,对应观察者打印
        provider.BaggageStatus(712);
        observer2.Unsubscribe();
        provider.BaggageStatus(400);
        provider.LastBaggageClaimed();
    }
}
// The example displays the following output:
//      Arrivals infORMation from BaggageClaimMonitor1
//      Detroit                712    3
//
//      Arrivals information from BaggageClaimMonitor1
//      Detroit                712    3
//      Kalamazoo              712    3
//
//      Arrivals information from BaggageClaimMonitor1
//      Detroit                712    3
//      Kalamazoo              712    3
//      New York-Kennedy       400    1
//
//      Arrivals information from SecurityExit
//      Detroit                712    3
//
//      Arrivals information from SecurityExit
//      Detroit                712    3
//      Kalamazoo              712    3
//
//      Arrivals information from SecurityExit
//      Detroit                712    3
//      Kalamazoo              712    3
//      New York-Kennedy       400    1
//
//      Arrivals information from BaggageClaimMonitor1
//      Detroit                712    3
//      Kalamazoo              712    3
//      New York-Kennedy       400    1
//      San Francisco          511    2
//
//      Arrivals information from SecurityExit
//      Detroit                712    3
//      Kalamazoo              712    3
//      New York-Kennedy       400    1
//      San Francisco          511    2
//
//      Arrivals information from BaggageClaimMonitor1
//      New York-Kennedy       400    1
//      San Francisco          511    2
//
//      Arrivals information from SecurityExit
//      New York-Kennedy       400    1
//      San Francisco          511    2
//
//      Arrivals information from BaggageClaimMonitor1
//      San Francisco          511    2
using System;
using System.Collections.Generic;
public class ArrivalsMonitor : IObserver<BaggageInfo>
{
    private string name;
    private List<string> flightInfos = new List<string>();
    private IDisposable cancellation;
    private string fmt = "{0,-20} {1,5}  {2, 3}";
    public ArrivalsMonitor(string name)
    {
        if (String.IsNullOrEmpty(name))
            throw new ArgumentNullException("The observer must be assigned a name.");
        this.name = name;
    }
    public virtual void Subscribe(BaggageHandler provider)
    {
                      // 参数是处理者! 添加观察者 this
        cancellation = provider.Subscribe(this);
    }
    public virtual void Unsubscribe()
    {
        cancellation.Dispose();
        flightInfos.Clear();
    }
    public virtual void OnCompleted()
    {
        flightInfos.Clear();
    }
    // No implementation needed: Method is not called by the BaggageHandler class.
    public virtual void OnError(Exception e)
    {
        // No implementation.
    }
    // Update information.
    public virtual void OnNext(BaggageInfo info)
    {
        bool updated = false;
        // Flight has unloaded its baggage; remove from the monitor.
        if (info.Carousel == 0)
        {
            var flightsToRemove = new List<string>();
            string flightNo = String.Format("{0,5}", info.FlightNumber);
            foreach (var flightInfo in flightInfos)
            {
                if (flightInfo.Substring(21, 5).Equals(flightNo))
                {
                    flightsToRemove.Add(flightInfo);
                    updated = true;
                }
            }
            foreach (var flightToRemove in flightsToRemove)
                flightInfos.Remove(flightToRemove);
            flightsToRemove.Clear();
        }
        else
        {
            // Add flight if it does not exist in the collection.
            string flightInfo = String.Format(fmt, info.From, info.FlightNumber, info.Carousel);
            if (!flightInfos.Contains(flightInfo))
            {
                flightInfos.Add(flightInfo);
                updated = true;
            }
        }
        if (updated)
        {
            flightInfos.Sort();
            Console.WriteLine("Arrivals information from {0}", this.name);
            foreach (var flightInfo in flightInfos)
                Console.WriteLine(flightInfo);
            Console.WriteLine();
        }
    }
}
using System;
using System.Collections.Generic;
public class BaggageHandler : IObservable<BaggageInfo>
{
    private List<IObserver<BaggageInfo>> observers;
    private List<BaggageInfo> flights;
    public BaggageHandler()
    {
        observers = new List<IObserver<BaggageInfo>>();
        flights = new List<BaggageInfo>();
    }
    public IDisposable Subscribe(IObserver<BaggageInfo> observer)
    {
        // Check whether observer is already reGIStered. If not, add it
        if (!observers.Contains(observer))
        {
            observers.Add(observer);
            // Provide observer with existing data.
            foreach (var item in flights)
                observer.OnNext(item);
        }
        return new Unsubscriber<BaggageInfo>(observers, observer);
    }
    // Called to indicate all baggage is now unloaded.
    public void BaggageStatus(int flightNo)
    {
        BaggageStatus(flightNo, String.Empty, 0);
    }
    public void BaggageStatus(int flightNo, string from, int carousel)
    {
        var info = new BaggageInfo(flightNo, from, carousel);
        // Carousel is assigned, so add new info object to list.
        if (carousel > 0 && !flights.Contains(info))
        {
            flights.Add(info);
            foreach (var observer in observers)
                observer.OnNext(info);
        }
        else if (carousel == 0)
        {
            // Baggage claim for flight is done
            var flightsToRemove = new List<BaggageInfo>();
            foreach (var flight in flights)
            {
                if (info.FlightNumber == flight.FlightNumber)
                {
                    flightsToRemove.Add(flight);
                    foreach (var observer in observers)
                        observer.OnNext(info);
                }
            }
            foreach (var flightToRemove in flightsToRemove)
                flights.Remove(flightToRemove);
            flightsToRemove.Clear();
        }
    }
    public void LastBaggageClaimed()
    {
        foreach (var observer in observers)
            observer.OnCompleted();
        observers.Clear();
    }
}
using System;
using System.Collections.Generic;
public class BaggageInfo
{
    private int flightNo;
    private string origin;
    private int location;
    internal BaggageInfo(int flight, string from, int carousel)
    {
        this.flightNo = flight;
        this.origin = from;
        this.location = carousel;
    }
    public int FlightNumber
    {
        get { return this.flightNo; }
    }
    public string From
    {
        get { return this.origin; }
    }
    public int Carousel
    {
        get { return this.location; }
    }
}
using System;
using System.Collections.Generic;
internal class Unsubscriber<BaggageInfo> : IDisposable
{
    private List<IObserver<BaggageInfo>> _observers;
    private IObserver<BaggageInfo> _observer;
    internal Unsubscriber(List<IObserver<BaggageInfo>> observers, IObserver<BaggageInfo> observer)
    {
        this._observers = observers;
        this._observer = observer;
    }
    public void Dispose()
    {
        if (_observers.Contains(_observer))
            _observers.Remove(_observer);
    }
}

流程简单分析

在这里插入图片描述

在这里插入图片描述

个人理解

类:

  • 核心处理类(控制者/处理者)
    • 信息数据列表
    • 观察者列表
  • 观察者类
  • 数据信息类
  • 释放空间

流程:

处理者接收新数据判断是否存在,不存在添加到数据列表中,然后遍历观察者列表,根据新数据执行新动作。

观察者类主要实现自身的添加和删除操作,将处理者作为参数传进自身中,调用处理者中的添加观察者函数进行添加绑定。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!     

--结束END--

本文标题: 一起来学习C#的观察者模式

本文链接: https://www.lsjlt.com/news/143580.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一起来学习C#的观察者模式
    using System; using System.Collections.Generic; public class Example { public static vo...
    99+
    2024-04-02
  • C++设计模式中的观察者模式一起来看看
    设计模式:观察者模式 观察者模式也称发布订阅模式,发布者发布消息,订阅者接收消息。 发布者接口 #ifndef __observerPatterns_publish_hpp__ #d...
    99+
    2024-04-02
  • C#中的EventHandler观察者模式详解
    目录一、解释二、事件具有以下特点:C# 和 java 比较:java 中使用的是接口。C# 使用委托机制,可以用时 + 运算符进行注册,直接多播。而 java 中是一般是使用一个集合...
    99+
    2024-04-02
  • JavaScript设计模式中的观察者模式
    目录观察者设计模式初始数据被观察者观察者观察者设计模式 观察者设计模式中分为被观察者和观察者,当被观察者触发了某个边界条件,观察者就会触发事件,这里需要俩个构造函数进行观察者设计模式...
    99+
    2024-04-02
  • Java设计模式中的观察者模式
    目录一.介绍二.场景约束三.UML类图四.示意代码(版本一)五.示意代码(版本二)六.观察者模式与发布订阅模式七.优点八.在JDK中的典型应用一.介绍 观察者模式(Observer ...
    99+
    2023-02-16
    Java观察者模式 Java设计模式
  • C#中的EventHandler观察者模式怎么实现
    这篇文章主要介绍“C#中的EventHandler观察者模式怎么实现”,在日常操作中,相信很多人在C#中的EventHandler观察者模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中的Eve...
    99+
    2023-06-29
  • C++示例讲解观察者设计模式
    目录引言什么是观察者设计模式解决的问题编程思路知识小百科引言 用来解决两个不相关对象之间的一对一或者一对多的通信模型。 什么是观察者设计模式 观察者模式是一种对象行为模式。它定义对象...
    99+
    2022-12-26
    C++观察者设计模式 C++观察者模式 C++设计模式
  • 一文带你理解JavaScript观察者模式
    目录为什么需要观察者模式代码示例应用场景DOM事件监听:数据绑定自定义事件Promise对象Pub/Sub模式观察者模式(Observer Pattern)是一种行为型设计模式,它定...
    99+
    2023-05-19
    JavaScript 观察者模式 JavaScript 观察者
  • C#实现观察者模式(Observer Pattern)的两种方式
    在观察者模式中有2个要素:一个是被观察对象,另一个是观察者。但被观察对象的状态发生改变会通知观察者。 举例:把订阅报纸的人看作是观察者,把报纸看作被观察对象。每当有新的新闻就要通知订...
    99+
    2024-04-02
  • 详解Java中的观察者模式
    详解Java中的观察者模式?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更...
    99+
    2023-05-31
    java 观察 观察者模式
  • java的观察者模式是什么
    这篇文章主要讲解了“java的观察者模式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java的观察者模式是什么”吧!消息队列(MQ),一种能实现生产...
    99+
    2024-04-02
  • PHP中的观察者模式是什么
    这篇文章主要讲解了“PHP中的观察者模式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中的观察者模式是什么”吧!介绍现在有两派,有的人建议使用设计模式,有的人不建议使用设计模式!...
    99+
    2023-06-20
  • Java观察者模式的深入了解
    目录一、观察者模式的定义和特点二、观察者模式的结构三、代码实例代码示例总结一、观察者模式的定义和特点 观察者模式的定义: 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时...
    99+
    2024-04-02
  • Java设计模式中的观察者模式怎样的
    今天就跟大家聊聊有关Java设计模式中的观察者模式怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、观察者模式的定义和特点观察者模式的定义:指多个对象间存在一对多的依赖关系,当...
    99+
    2023-06-22
  • 怎么理解Java设计模式的观察者模式
    本篇内容介绍了“怎么理解Java设计模式的观察者模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是观察者模式在许多设计中,经常涉及...
    99+
    2023-06-25
  • Vue2.0中观察者模式的示例分析
    这篇文章主要介绍了Vue2.0中观察者模式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.Vue1.0 事件的广播与接收(观察者...
    99+
    2024-04-02
  • js观察者模式的介绍及使用
    目录一、定义 二、使用场景 三、举个例子 四、Coding 一、定义 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(通知者)。这个主题对象观察到被观...
    99+
    2024-04-02
  • JavaScript观察者模式:揭秘设计模式的奥妙
    观察者模式是一种软件设计模式,它允许一个对象(发布者)的状态或者行为的变化通知依赖于它的其他对象(观察者)。当发布者状态发生改变时,所有注册的观察者都会收到通知,并做出相应的反应。 观察者模式在JavaScript中实现起来非常简单,它...
    99+
    2024-02-03
    JavaScript 观察者模式 设计模式 事件 监听器 发布/订阅
  • Javascript中观察者模式的示例分析
    这篇文章主要为大家展示了“Javascript中观察者模式的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Javascript中观察者模式的示例分析”这...
    99+
    2024-04-02
  • 优化 VUE 观察者性能,让你的应用飞起来
    Vue 观察者系统是一种数据响应系统,它允许组件自动更新,当其依赖的数据发生变化时。 Vue 使用一种称为依赖收集的机制来跟踪组件与被观察数据的依赖关系。 2. 优化数据结构 避免使用深层嵌套对象:深层嵌套的数据结构会使依赖收集变得...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作