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);
                }
            }
        }
    }
    

      

  • 相关阅读:
    访问HTML可以,访问PHPfile not found
    查看php-fpm的进程和端口号
    nginx调用PHP有sock方式和端口方式
    Linux创建用户、设置密码、修改用户、删除用户命令
    CentOS7 添加FTP用户并设置权限
    PHP使用文件锁解决高并发问题示例
    Huge CSV and XML Files in Python, Error: field larger than field limit (131072)
    怎样查询房产证是否抵押
    Python中模拟enum枚举类型的5种方法分享
    git for windows+TortoiseGit客户端的使用
  • 原文地址:https://www.cnblogs.com/bg57/p/3647515.html
Copyright © 2011-2022 走看看