zoukankan      html  css  js  c++  java
  • C#设计模式

    1.概念

         观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

    2.角色

          2.1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

      2.2 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

      2.3 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

      2.4 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

    3.具体实现之委托实现。

      模拟的场景:猫叫了,老鼠跑了、主人醒了。

         3.1 ISubject 抽象

        public delegate void NotifyHandler();
    public abstract class ISubject { public event NotifyHandler NotifyEvent; protected void Notify() { if (NotifyEvent != null) NotifyEvent(); } public virtual void Run() { } }

         3.2 CatSubject

       public class CatSubject : ISubject
        {
            public override void Run()
            {
                Console.WriteLine("猫叫了...");
                this.Notify();
            }
        }

          3.3 Observer

      public abstract class Observer
        {
            protected Observer(ISubject sub)
            {
                sub.NotifyEvent += Response;
            }
    
            public abstract void Response();
        }

          3.4 MouseObserver

      public class MouseObserver : Observer
        {
            public MouseObserver(ISubject sub)
                : base(sub)
            {
    
            }
            public override void Response()
            {
                Console.WriteLine("老鼠跑了!");
            }
        }

          3.5 MasterObserver

    public class Master2Observer : Observer
        {
            public Master2Observer(ISubject sub):base(sub)
            {
                
            }
            public override void Response()
            {
                Console.WriteLine("主人醒了....");
            }
        }

          3.6 调用

    var sub = new CatSubject();
    var mouse = new MouseObserver(sub);
    var master = new Master2Observer(sub);
    sub.Run(); 

          3.7 结果

        

  • 相关阅读:
    公司后台切图
    XMLHttpRequest对象
    XML/JSDOM处理
    js访问xml之节点操作
    CSS3 输入框阴影效果及其他阴影效果
    GitHub用户仓库批量下载
    WTL10_9163应用向导安装后的小问题
    别学MFC了,要学就学这些...
    使用基于范围的 for 循环迭代范围
    使用未命名的命名空间代替静态全局变量
  • 原文地址:https://www.cnblogs.com/gaobing/p/4663461.html
Copyright © 2011-2022 走看看