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

  • 相关阅读:
    jquery-卡片翻转
    bootstrap-3-验证表单
    jqeury-地区三级联动
    bootstrap-实现loading效果
    Thymeleaf-语法整理
    jquery-网站收藏
    ssh-免密登录批量发送脚本
    linux-网站收藏
    关闭防火墙
    hadoop-网站收藏
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1605292.html
Copyright © 2011-2022 走看看