zoukankan      html  css  js  c++  java
  • 观察者模式(Observer pattern)

    本文直接使用.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);
                }
            }
        }
    }
    

      

  • 相关阅读:
    java maven 操作 收集的一些命令
    Java多线程,线程交替执行
    java类同时引用父类和接口的成员变量,需要指明是父类的还是接口的
    artTemplate 模板使用
    Dubbo 只注册,只订阅
    Tomcat灵活配置多项目,多端口,多域名,多虚拟目录
    CentOS7.2 安装nginx-1.10.3
    CentOS7.2 安装zookeeper3.4.9
    CentOS7.2 安装Redis3.2.8
    CentOS7.2 切换成iptables规则
  • 原文地址:https://www.cnblogs.com/bg57/p/3647515.html
Copyright © 2011-2022 走看看