常建57

路漫漫其修远兮。。。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

本文直接使用.net 提供的接口来实现Observer Pattern(IObserver,IObservable)。 也可以自定义接口。

如何实现:

1.定义一个Subject Provider 类。

  需要实现Subscribe()。

2.定义一个Observer 类。

  需要实现OnNext()  用来输出信息或者要执行的操作。

  需要实现OnComplete()  完成后要执行的操作。

  需要实现OnError()  万一出现错误,输出错误信息。

下面提供一个我能想到的最简单的Sample,忽略所有其它细节,只关注Observer pattern。

Sample:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestObserverPatternSimplestSample
{
    class Program
    {
        static void Main(string[] args)
        {
            MySubjectProvider provider=new MySubjectProvider();
            MyObserver observer1=new MyObserver("observer1");
            provider.Subscribe(observer1);
         //   provider.Subscribe(observer1).Dispose();
            MyObserver observer2 = new MyObserver("observer2");
            provider.Subscribe(observer2);

            provider.NotifyObserver("hello");

            Console.ReadLine();

        }
    }

    public class MyObserver : IObserver<string>
    {
        private IDisposable _disposable;
        private string _name;
        public MyObserver(string name)
        {
            this._name = name;
        }

        public string Name {
            get { return this._name; } 
        }
        public void OnCompleted()
        {
            Console.WriteLine("observer complete event. ");
        }

        public void OnNext(string msg)
        {
            Console.WriteLine("the {0} is received msg {1} from subject provider.",Name, msg);
        }

        public void OnError(Exception ex)
        {
           Console.WriteLine("error occured");
        }

        public void Unsubscribe(IObservable<string> provider )
        {
          //  provider.
        }
    }

    public class MySubjectProvider : IObservable<string>
    {
        public List<IObserver<string>> observers=new List<IObserver<string>>(); 
        public IDisposable Subscribe(IObserver<string> observer)
        {
            if(!observers.Contains(observer))
                observers.Add(observer);
            return new UnSubscribe(observers,observer);
        }

        public class UnSubscribe : IDisposable
        {
            private List<IObserver<string>> _observers;
            private IObserver<string> _observer;
            public UnSubscribe(List<IObserver<string>> observers,IObserver<string> observer )
            {
                this._observers = observers;
                this._observer = observer;
            }

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

        public void NotifyObserver(string msg)
        {
            foreach (var observer in observers)
            {
                observer.OnNext(msg);
            }
        }
    }
}

  

posted on 2014-04-05 20:19  常建57  阅读(197)  评论(0编辑  收藏  举报