`
chenying998179
  • 浏览: 25233 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Observer Pattern Example in C# with IObservable

阅读更多

Another day, another pattern. The Observer Pattern provides a mechanism for receiving push-based notifications (like events). It separates the Subject from the Observer (separation of concerns). The original pattern by the Group of Four was implemented with base classes, but as of .NET 4 we welcome the IObserver andIObservable interfaces (both of type T) to take care of this.

So, if you want to monitor changes in, let’s say, a news feed (the subject) I can do that within an observer. This news feed pushes notifications to the observer (News Monitor) and the observer makes changes accordingly (writes something to the console). The example looks a lot like .NET event handling.

using System;
using System.Collections.Generic;

namespace Observer
{
    class Program
    {
        static void Main(string[] args)
        {
            NewsFeed newsFeedNull = new NewsFeed();
            NewsFeed newsFeedRemondo = new NewsFeed();
            NewsFeedMonitor newsFeedMonitor = new NewsFeedMonitor();

            IDisposable unsubscriberNYT =
                newsFeedNull.Subscribe(newsFeedMonitor);
            IDisposable unsubscriberRemondo =
                newsFeedRemondo.Subscribe(newsFeedMonitor);

            newsFeedNull.Uri = null; // to force an error
            newsFeedRemondo.Uri = new Uri("http://remondo.net/feed");

            Console.Read();

            unsubscriberNYT.Dispose();
            unsubscriberRemondo.Dispose();
        }
    }

    class NewsFeed : IObservable<NewsFeed>
    {
        private List<IObserver<NewsFeed>> observers =
            new List<IObserver<NewsFeed>>();

        private Uri _uri;

        public Uri Uri
        {
            get { return _uri; }
            set
            {
                _uri = value;
                this.Notify(this);
            }
        }

        public IDisposable Subscribe(IObserver<NewsFeed> observer)
        {
            if (!this.observers.Contains(observer))
            {
                observers.Add(observer);
            }

            return new Unsubscriber(this.observers, observer);
        }

        private void Notify(NewsFeed newsFeed)
        {
            foreach (var observer in this.observers)
            {
                if (this._uri == null)
                {
                    observer.OnError(new Exception("Sumtinwong"));
                }
                else
                {
                    observer.OnNext(this);
                }
            }
        }

        private void StopReading()
        {
            foreach (var observer in this.observers)
            {
                if (this.observers.Contains(observer))
                {
                    observer.OnCompleted();
                }

                observers.Clear(); // No more dangling events!
            }
        }

        class Unsubscriber : IDisposable
        {
            private List<IObserver<NewsFeed>> _observers;
            private IObserver<NewsFeed> _observer;

            public Unsubscriber(List<IObserver<NewsFeed>> observers,
                IObserver<NewsFeed> observer)
            {
                this._observers = observers;
                this._observer = observer;
            }

            public void Dispose()
            {
                if (this._observer != null
                    && this._observers.Contains(this._observer))
                {
                    this._observers.Remove(_observer);
                }
            }
        }
    }

    class NewsFeedMonitor : IObserver<NewsFeed>
    {
        public void OnCompleted()
        {
            Console.WriteLine("No more news today...");
        }

        public void OnError(Exception error)
        {
            Console.WriteLine("Error in News Feed... "
                + error.Message);
        }

        public void OnNext(NewsFeed value)
        {
            Console.WriteLine("There's a news News Item... "
                + value.Uri.AbsoluteUri);
        }
    }
}

And here’s the result (with spelling error :-) )…

Also check out Mattia Baldinger’s post with a nice generic IObservable class.

分享到:
评论

相关推荐

    Observer Pattern Example.rar

    设计模式之观察者模式和静态工厂的结合实践

    ObserverPattern

    设计模式之观察者模式ObserverPattern

    详解Observer Pattern(观察者模式)在Java中的使用原理

    我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...

    ObserverPattern.unitypackage

    ObserverPattern.unitypackage是一个以unity为例写的观察者模式的应用举例。有需要的同学请下载!

    matlab开发-Observerpattern

    matlab开发-Observerpattern。观察者模式示例

    swift-Swiftµframework实现观察者模式Observerpattern

    Swift µframework 实现观察者模式Observer pattern

    ObserverPattern2-Code5.zip

    这是关于C#中的观察者模式的教程文章。我们首先介绍作为GoF模式之一的经典观察者模式。观察者模式通过使用事件机制集成到C#中,这将在接下来讨论。然后,我们讨论与在C#中使用事件/事件处理程序相关的问题。

    设计模式之观察者模式(Observer Pattern)

    定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

    Observer Pattern.rar

    设计模式之观察者模式和静态工厂的结合实践

    ObserverPattern.zip

    例题代码:李先生希望及时知道气象站的天气预报及旅行社的每日旅行信息。 李先生就是具体的一个观察者,而气象站及旅行社就成为了主题。

    C#设计模式(17)——观察者模式(Observer Pattern).pdf

    从生活中的例子可以看出,只要对订阅号进行关注的客户端,如果订阅号有什么更新,就会直接推送给订阅了的用户。从中,我们就可以得出观察者模式的定义。  观察者模式定义了一种一对多的依赖关系,让多个观察者对象...

    C#观察者模式(Observer Pattern)实例教程

    主要介绍了C#观察者模式(Observer Pattern),主要以一个实例的形式讲述了C#观察者模式的实现过程,详细讲述了接口的定义、通知及动作的实现方法,需要的朋友可以参考下

    C#设计模式-吕震宇

    设计模式(19)-Observer Pattern 设计模式(18)-Command Pattern 设计模式(17)-Chain of Responsibility Pattern 设计模式(16)-Bridge Pattern 设计模式(15)-Facade Pattern 设计模式(14)-Flyweight...

    类似 Observer Pattern 的 NSNotificationCenter (实例)

    NULL 博文链接:https://justcoding.iteye.com/blog/1476165

    observer-pattern:New's Station Observer Pattern演示

    观察者模式 New's Station Observer Pattern演示

    组合模式 Composite Pattern

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...

    Programming.in.the.Large.with.Design.Patterns

    Each pattern is introduced with a non-technical example or story that illustrates the pattern concept. The details are described with Java code examples and UML diagrams. Each pattern description ...

    02-observer-pattern

    head-first-design-pattern—02-observer-pattern(观察者模式),融入了个人的见解,里面包含错误的实现和正确的标准实现,你可以对比学习,加深对模式的理解

Global site tag (gtag.js) - Google Analytics