zoukankan      html  css  js  c++  java
  • 观察者模式和委托

    用观察者模式和委托写一个兔子跑狮子追的例子,看看他们的特点(委托是个类,事件是委托的一个实例,事件存在时是个方法的指针)

    流程:

    1.一个狮子,和一个兔子(可以多个委托和观察者都可以是多个) 

    2.狮子和兔子互相看到了

    3.兔子开始跑

    4.狮子开始追

    一。委托的例子

    程序流程

    1.定义一个跑的委托(跑是自然规律之一,人拿枪来了狮子也得跑,是通用的,委托实际就是方法的接口类)

    2.兔子类:

      (1).跑的一个实例事件,兔子自己跑的行为

      (2).兔子跑的行为方法

    3.狮子类:

      (1).狮子追的行为方法

    4.场景类(就是页面)

      (1).有个兔子

      (2).有个狮子

      (3).狮子和兔子见面场景

      (4).兔子跑事件发生会引发狮子追(如果看见了,引发)

    public partial class Default2 : System.Web.UI.Page
    {
        兔子 兔子1 = new 兔子();
        狮子 狮子1 = new 狮子();
        protected void Page_Init(object sender, EventArgs e)
        {
            兔子1.兔子跑事件 += new 跑(狮子1.追);//是否在这个场景互相看见了,如果看见了,注册这代码,这个代码的实质是把狮子的“追”方法指针告诉“兔子跑事件”
        }
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected void 狮子和兔子互相看到了_Click(object sender, EventArgs e)//一个button事件
        {
            兔子1.我跑了();
        }
    }
    public delegate void 跑(string 跑的东西);
    public class 兔子
    {
        public event 跑 兔子跑事件;
        public void 我跑了()
        {
            开始跑();
        }
        private void 开始跑()
        {
            if (兔子跑事件 != null)//如果被狮子看见了,如果没看见,就不通知狮子了,自己随便跑着玩,没人追(其实就是注册的代码)
            {
                兔子跑事件("兔子1");
            }
        }
    }

    public class 狮子
    {
        public void 追(string 跑的东西)
        {
            System.Web.HttpContext.Current.Response.Write("全国都解放了" + 跑的东西 + "你往那跑");
        }
    }

    二。观察者例子

    //“观察者”接口
    public interface IObserver
    {
        void Notify(object anObject);
    }
    //“被观察对象”接口
    public interface IObservable
    {
        void Register(IObserver anObserver);
        void UnRegister(IObserver anObserver);
    }

    //所有被观察对象的基类
    public class ObservableImpl : IObservable
    {
        //保存观察对象的容器
        protected Hashtable _observerContainer = new Hashtable();
        //注册观察者
        public void Register(IObserver anObserver)
        {
            _observerContainer.Add(anObserver, anObserver);
        }
        //撤销注册
        public void UnRegister(IObserver anObserver)
        {
            _observerContainer.Remove(anObserver);
        }
        //将事件通知观察者
        public void NotifyObservers(object anObject)
        {
            //枚举容器中的观察者,将事件一一通知给他们
            foreach (IObserver anObserver in _observerContainer.Keys)
            {
                anObserver.Notify(anObject);
            }
        }
    }

    //业务数据(被观察对象)
    public class SomeData : ObservableImpl
    {
        //被观察者中的数据
        float _askPrice;
        //改变数据的属性
        public float AskPrice
        {
            set
            {
                _askPrice = value;
                base.NotifyObservers(_askPrice);//将改变的消息通知观察者
            }
        }
    }
    //用户界面(观察者)
    public class SomeKindOfUI : IObserver
    {
        public void Notify(object anObject)
        {
            Console.WriteLine("The new ask price is:" + anObject);
        }
    }
    //实际调用的过程
    public class MainClass
    {
        public static void Main()
        {
            //创建观察者和被观察者
            SomeKindOfUI ui = new SomeKindOfUI();
            SomeData data = new SomeData();
            //在被观察对象中注册观察者
            data.Register(ui);
            //改变被观察对象中的数据,这时被观察者会通知观察者
            data.AskPrice = 1000f;
            //注销观察者,停止观察
            data.UnRegister(ui);
        }
    }

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第50章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第49章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第48章 读书笔记(待更新)
    Spring Boot 中使用 Quartz 实现任务调度
    实战 FastDFS Java 客户端上传文件
    分布式文件系统之 FastDFS
    Java 持久层框架之 MyBatis
    C语言实现贪吃蛇
    [转载]分享三篇非常好的学习心得
    selenium加载cookie报错问题:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1605292.html
Copyright © 2011-2022 走看看