365体育网址街道上之汽车是观察者。大街上的汽车是观察者。

1.引言

         最近于描绘一些主次玩的当儿,接触到了delegate(委托)和event(事件),网上寻找了多底素材,有些博文说得将delegate近似当做C++当中的函数指针来拘禁,由于自己自对C++的知晓并无是殊透彻,所以看得仍然朦朦胧胧。今天教学学习了统筹模当中的观察者模式。仔细读之下,又对信托以及事件来了新的体悟,特分享给大家。也要会同诸位好虾多多交流。

1.引言

         最近以形容一些程序玩的时刻,接触到了delegate(委托)和event(事件),网上搜了好多底素材,有些博文说可拿delegate近似当做C++当中的函数指针来拘禁,由于自己自对C++的知晓并无是很透彻,所以看得仍然朦朦胧胧。今天教学习了计划模当中的观察者模式。仔细读之下,又对信托以及波来了新的体悟,特分享给大家。也意在会跟各位老虾多多交流。

2.观察者模式介绍

2.观察者模式介绍

2.1概述

      观察者模式是立平等栽对象与对象期间的赖关系,一种植对象有反时拿自行通知任何对象,其他对象相应的做出反应。在观察者模式遭遇,发生变动之目标称为观察对象,被通报对象称为观察者,一个相对象可以针对许多个观察者,而且这些观察者之间可以没有外相互关联。就像以街道上,红灯亮起,来往的汽车已,绿灯亮起,汽车可以持续发展,在是历程遭到,交通信号是汽车之观测对象,大街上的汽车是观察者,并且马路上之每个汽车都是独的村办没有互相的维系。

2.1概述

      观察者模式是成立平等种对象和对象之间的乘关系,一种植对象来变动时用机关通知其他对象,其他对象相应的做出反应。在观察者模式受到,发生改变的目标称为观察对象,被通对象称为观察者,一个相对象可以本着许多个观察者,而且这些观察者之间可以没有外相互联系。就像以街道上,红灯亮起,来往的汽车停,绿灯亮起,汽车可以继承发展,在斯历程遭到,交通信号是汽车之观测对象,大街上的汽车是观察者,并且马路上之每个汽车都是独立的村办没有互相的联系。

2.2观察者模式之定义

2.2观察者模式的概念

观察者模式:定义对象之间平等栽同等对准几近靠关系,使得在一个目标状态有反时,其休戚相关依赖对象还取得通知并于更新。

Observer Pattern: Define a one-to-manydependency between objects so that
when one object changes state , all itsdependts are notified and update
automatically.

观察者模式:定义对象之间平等栽同等针对性大多靠关系,使得在一个对象状态有改变时,其相关依赖对象还取通知并让更新。

Observer Pattern: Define a one-to-manydependency between objects so that
when one object changes state , all itsdependts are notified and update
automatically.

2.3观察者模式组织

365体育网址 1

 观察者模式涵盖以下四只角色:

(1)Subject(目标)

(2)ConcreteSubject(具体对象)

(3)Observer(观察者)

(4)ConcreteObserve(具体观察者)

2.3观察者模式结构

365体育网址 2

 观察者模式涵盖以下四只角色:

(1)Subject(目标)

(2)ConcreteSubject(具体对象)

(3)Observer(观察者)

(4)ConcreteObserve(具体观察者)

2.4代码实例 

using System.Collection


//定义一个抽象目标类Subject

abstract class Subject
{
       //定义一个观察者集合用于存储所有观察者对象
      protected ArrayList observers = new ArrayList();

      //声明抽象注册方法,用于向观察者集合中增加一个观察者
      public abstract void Attach(Observer observer);

      //声明抽象的注销方法,用于在观察者集合中删除一个观察者
      public abstract void Detach(Oberver observer)

     //声明抽象通知方法
      public abstract void Notify();     
}    

//具体目标类ConcreteSubject 是实现了抽象目标类Subject的一个具体
//子类,它实现了上述的3中方法

class ConcreteSubject : Subject
{
    public override void Attach(Observer observer)
    {
        observers.Add(observer);
    }

    public override void Detach(Observer observer)
    {
        observers.Remove(observer);
    }

    //实现通知方法
    public override void Notify()
    {
        //遍历观察者几何,调用每一个观察者的相应方法
        foreach (object obs in observers)
        {
            ((Observer)obs).Update();
        }
    }

    /*抽象观察者一般定义为一个借口,通常只声明一个Update()方法
     *为不同观察者的更新(相应)行为定义相同的借口,这个方法在其
     *子类中实现。
     */
     interface Observer
     {
        void Update();
     }

     //具体观察者ConcreteObserver中实现Update()方法
     class ConcreteObserver : Observer
     {
        //实现方法
        public void Update()
        {
        //具体更新代码
        }
     }
     static void Main(string[] args)
     {
        ...
        Subject subject = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        subject.Attach(observer);
        subject.Notify();
        ...
     }
}

2.4代码实例 

using System.Collection


//定义一个抽象目标类Subject

abstract class Subject
{
       //定义一个观察者集合用于存储所有观察者对象
      protected ArrayList observers = new ArrayList();

      //声明抽象注册方法,用于向观察者集合中增加一个观察者
      public abstract void Attach(Observer observer);

      //声明抽象的注销方法,用于在观察者集合中删除一个观察者
      public abstract void Detach(Oberver observer)

     //声明抽象通知方法
      public abstract void Notify();     
}    

//具体目标类ConcreteSubject 是实现了抽象目标类Subject的一个具体
//子类,它实现了上述的3中方法

class ConcreteSubject : Subject
{
    public override void Attach(Observer observer)
    {
        observers.Add(observer);
    }

    public override void Detach(Observer observer)
    {
        observers.Remove(observer);
    }

    //实现通知方法
    public override void Notify()
    {
        //遍历观察者几何,调用每一个观察者的相应方法
        foreach (object obs in observers)
        {
            ((Observer)obs).Update();
        }
    }

    /*抽象观察者一般定义为一个借口,通常只声明一个Update()方法
     *为不同观察者的更新(相应)行为定义相同的借口,这个方法在其
     *子类中实现。
     */
     interface Observer
     {
        void Update();
     }

     //具体观察者ConcreteObserver中实现Update()方法
     class ConcreteObserver : Observer
     {
        //实现方法
        public void Update()
        {
        //具体更新代码
        }
     }
     static void Main(string[] args)
     {
        ...
        Subject subject = new ConcreteSubject();
        Observer observer = new ConcreteObserver();
        subject.Attach(observer);
        subject.Notify();
        ...
     }
}

3..NET中的delegate与event

.NET中的信托事件模型是观察者模式于.NET中的经文应用,在WinForm编程中需要编制时间处理程序对所出的波(例如鼠标单击、菜单项选取等)做出反应,并实行相应的操作。事件于硌后,并推行响应该事件的一个或者多独事件处理程序,可以将一个事变目标(例如按钮、文本框、菜单等)成为事件之发送者(事件源对象),接收并应事件的对象称为时间之接收者(事件处理对象)。与观察这模式相呼应,事件源对象担任观察对象角色,事件处理对象担任具体观察者角色,如果事件源对象的之一事件触发,则调用事件处理对象吃的事件处理程序对事件进展处理。

每当.NETzhong
,如果急需由WinForm控件获取事件,提供一个委托(Delegate)类型的EventHandler,然后拿其注册及事件源。在这边委托对象担任着抽象观察者的角色,所有事件处理方法都得同嘱托方有同样的函数签名。

eventSource.someEvent += new
SomeEventHandler(someMethod);

以该语法中,eventSource表示事件源,someEvent表示定义在波源中的轩然大波,someEventHandler代表用于处理事件的嘱托,someMethod表示和信托SomeEventHandler具有同等函数签名的事件处理方法。用户仅需要修改someMethod,即可实现同之日子对诺不同的光阴处理程序。

每当.NET事件被,事件源并不需要知道哪对象要方会受到将要发生的通告,它才享有与签名相契合的不二法门的援,即委托;还可由此多再传送事件来实现一个事件产生了独订阅者,即由此信托将多单办法上加到拖欠事件被,当该事件给硌时,同时施行相应之差不多个事件处理方法。

代码实例:

using System;

namespace ObserverExtend
{
    class EventTest
    {
        //定义一个委托
        public delegate void UserInput(object sender, EventArgs e);

        //定义一个此委托类型的事件
        public event UserInput OnUserInput;

        //模拟事件触发,当输入“0”时引发事件
        public void Method()
        {
            bool flag = false;
            Console.WriteLine("请输入数字:");
            while(!flag)
            {
                if(Console.ReadLine() == "0")
                {
                    OnUserInput(this ,new EventArgs());
                }
            }
        }
    }

    class Program
    {
        public Program(EventTest test)
        {
            //注册或订阅事件
            test.OnUserInput += newEventTest.UserInput(Handler);
            test.OnUserInput += newEventTest.UserInput(HandlerMore);

            //注销或取消订阅
            //test.OnUserInput -= newEventTest.UserInput(Handler);
        }
        public void Handler(object sender,EventArgs e)
        {
            Console.WriteLine("数据输入结束!");
        }
        public void HandlerMore(object sender,EventArgs e)
        {
            Console.WriteLine("数据输入真的结束!");
        }

        static void Main(string[] args)
        {
            EventTest test = new EventTest();
            Program program = new Program();
            tset.Method();
        }
    }
}

  

在类EventTest中定义了一个委托UserInput和一个事变 OnUserInput,EventTest充当观察目标类的角色,而委托充当抽象观察者角色,在章程Method()中吸引了轩然大波,即调用与信托具备相同函数签名的方法,方法Method()即为目标类的打招呼方法。在客户端测试接近Program中提供切实的日子处理办法,并拿该方法及事件绑定在一块儿,这个过程叫订阅事件。
每当Program的构造函数中订阅事件,在这边,通过委托将鲜单道上加至事件被,即该事件来三三两两独订阅者,当事件触发时同时触发这些办法的实行,Program类充当具体观察者角色,可以对目标类的风波作出响应,方法Handler()和HandlerMore()
即为响应措施。

3..NET中的delegate与event

.NET中之托事件模型是观察者模式在.NET中的经应用,在WinForm编程中需编制时间处理程序对所起的事件(例如鼠标单击、菜单项选取等)做出反应,并履行相应的操作。事件给点后,并执行响应该事件的一个或多单事件处理程序,可以用一个风波目标(例如按钮、文本框、菜单等)成为事件之发送者(事件源对象),接收并应事件的靶子称为时间的接收者(事件处理对象)。与相及时模式相呼应,事件源对象担任观察对象角色,事件处理对象担任具体观察者角色,如果事件源对象的某个事件触发,则调用事件处理对象被之事件处理程序对事件开展拍卖。

每当.NETzhong
,如果急需打WinForm控件获取事件,提供一个委托(Delegate)类型的EventHandler,然后将它们注册及事件源。在此地委托对象担任着抽象观察者的角色,所有事件处理方法都得与信托方有同样的函数签名。

eventSource.someEvent += new
SomeEventHandler(someMethod);

当该语法被,eventSource表示事件源,someEvent表示定义在事件源中的轩然大波,someEventHandler代表用于处理事件的委托,someMethod表示和信托SomeEventHandler具有同等函数签名的事件处理方法。用户仅需要修改someMethod,即可实现平等之辰对诺不同的时空处理程序。

当.NET事件受到,事件源并不需要知道怎样对象或方会受到将要发生的关照,它不过拥有和签名相抱的章程的援,即委托;还足以经多再度传送事件来贯彻一个波时有发生了个订阅者,即透过委托将多独主意上加至拖欠事件备受,当该事件让触发时,同时执行相应之大都只事件处理方法。

代码实例:

using System;

namespace ObserverExtend
{
    class EventTest
    {
        //定义一个委托
        public delegate void UserInput(object sender, EventArgs e);

        //定义一个此委托类型的事件
        public event UserInput OnUserInput;

        //模拟事件触发,当输入“0”时引发事件
        public void Method()
        {
            bool flag = false;
            Console.WriteLine("请输入数字:");
            while(!flag)
            {
                if(Console.ReadLine() == "0")
                {
                    OnUserInput(this ,new EventArgs());
                }
            }
        }
    }

    class Program
    {
        public Program(EventTest test)
        {
            //注册或订阅事件
            test.OnUserInput += newEventTest.UserInput(Handler);
            test.OnUserInput += newEventTest.UserInput(HandlerMore);

            //注销或取消订阅
            //test.OnUserInput -= newEventTest.UserInput(Handler);
        }
        public void Handler(object sender,EventArgs e)
        {
            Console.WriteLine("数据输入结束!");
        }
        public void HandlerMore(object sender,EventArgs e)
        {
            Console.WriteLine("数据输入真的结束!");
        }

        static void Main(string[] args)
        {
            EventTest test = new EventTest();
            Program program = new Program();
            tset.Method();
        }
    }
}

  

当类EventTest中定义了一个委托UserInput和一个波 OnUserInput,EventTest充当观察目标类的角色,而委托充当抽象观察者角色,在方Method()中抓住了事件,即调用与信托有同样函数签名的方,方法Method()即为目标类的通告方法。在客户端测试类Program中提供切实的岁月拍卖措施,并将拖欠办法以及波绑定以同,这个过程叫订阅事件。
在Program的构造函数中订阅事件,在此处,通过信托将简单只措施上加到事件中,即该事件产生少个订阅者,当事件触发时同时触发这些艺术的实行,Program类充当具体观察者角色,可以针对目标类的波作出响应,方法Handler()和HandlerMore()
即为响应措施。

4.感悟

设计模式的学习为自己提升365体育网址了森对C#的掌握,记得有句话,有雄心壮志的开发人员还需努力发扬钻研精神,不拘泥与可视化软件其实带来的有益之处在,深入明相关的技术细节,这是中低档开发人员的必由之路。我们要会的不光是拖延一个Button。加油,与当今共勉~

4.感悟

设计模式的修为自己提升了重重对C#的知,记得发生句话,有抱负的开发人员还待努力弘扬钻研精神,不拘泥与可视化软件其实带来的有益的处,深入理解相关的技术细节,这是初级开发人员的必由之路。我们要会的不光是蘑菇一个Button。加油,与天子共勉~

5.参考资料

http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html

《C#设计模式》刘伟 胡志刚 闫朝坤 清华大学出版社

5.参考资料

http://www.cnblogs.com/wangjq/archive/2012/07/12/2587966.html

《C#设计模式》刘伟 胡志刚 闫朝坤 清华大学出版社

相关文章