托付和观察者模式

  

  托付在.Net中应用的很广泛。它实现了对函数的封装,能够当做给方法的特征指定一个名称,将方法当做还有一个方法的參数进行传递,这样的将方法动态地赋给參数的做法,能够避免在程序中使用过多的推断(条件)语句.如今将从我们生活中常见的事情——水沸腾了进行警报,进行对照实现。

一般写法:

<span style="font-family:SimSun;font-size:14px;">//一般的写法()
Public class Heater//热水器{
	Private int temperature;
	privatevoidBoilWater()
	//烧水
		{for(inti=0;i<=100;i++)
			{temperature=i;
			}
		}
}
Public class Alarm//警报器
{
	Private void MakeAlert(intparam)
	{
		Console.WriteLine("Alarm:嘀嘀嘀,水已经{0}度了:",param);
	}
}
Public class Display//显示器
{
	privatevoidShowMsg(intparam)
	{
		Console.WriteLine("Display:水已烧开,当前温度:{0}度。",param);
	}
}</span><span style="font-size:18px;font-family: KaiTi_GB2312;">
</span>

PS:一般写法是从网上找的,重点在于通过托付和观察者模式对上述代码进行改造

托付改造:

  加热器类

<span style="font-family:SimSun;font-size:14px;">//使用托付进行简单改造
namespace ConsoleApplication1
{
    /// <summary>
    /// 加热器类
    /// </summary>
    class Heater
    {
        public void BoilWater(int i)
        {
            Console.WriteLine("当前温度:" + i);
            if (BoilWaterMessage != null)<span style="color:#ff0000;">//假设Heater方法被运行时,没有对象注冊事件,则运行BoilWaterMessage</span>
            {
                BoilWaterMessage();
            }
        }
        public delegate void BoilWaterEventHandler();<span style="color:#ff0000;">//声明一个托付,也就是被监听的事件名称</span>
        public event BoilWaterEventHandler BoilWaterMessage;//<span style="color:#ff0000;">声明BoilWaterMessage  事件类型是上面所声明的托付类型</span>
    }
}</span><span style="font-family:KaiTi_GB2312;font-size:18px;">
</span>

  警报类

namespace ConsoleApplication1
{
    /// <summary>
    /// 警告类
    /// </summary>
    class Alarm
    {
        public void MessageAlert()
        {
            Console.WriteLine("水以沸腾,请注意安全");
        }
    }
}

  client

主执行程序
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Heater heater1 = new Heater();
                          Alarm alarm1 = new Alarm();

                          //将警告类的MessageAlert 方法注冊到BoilWaterMessage 托付中
            heater1.BoilWaterMessage += new Heater.BoilWaterEventHandler(alarm1.MessageAlert);

                         //原本BoilWater方法,由于被托付了警告事件,因此显示结果为:当前温度:i 水以沸腾,请注意安全
            heater1.BoilWater(100);

            Console.Read();
        }
    }
}

  执行结果:

  

  通过托付的改造,我们能够这样:托付与其所注冊的方法具有全然同样的行为。换而言之,被监听对象(Heater)运行某个方法(BoilWater(100))时,注冊在该方法(BoilWater(100))上的被托付方法(MessageAlert ())将会运行,总感觉有点触发器的味道!

观察者模式:

  抽象被观察者类:

    class AbstractHeater
    {
        //声明一个观察者集合类
        private IList<Alarm> alarms = new List<Alarm>();

        //注冊观察者的方法
        public void Attach(Alarm alarm)
        {
            alarms.Add(alarm);
        }

        /// <summary>
        /// 通知
        /// </summary>
        public void Notify()
        {
            foreach (Alarm a in alarms)
            {
                a.Update();
            }
        }

    }

  抽象观察者:

    abstract class AbstractAlarm
    {
        public abstract void Update();
    }

  被观察内容:

    /// <summary>
    /// 加热器类-被观察者
    /// </summary>
    class Heater:AbstractHeater
    {

        private int wendu;
        //观察者所关注的东西
        public int  Wendu
        {
            get
            {
                return wendu;
            }
            set
            {
                wendu = value;
            }

         }

    }
  

  详细观察者:

    /// <summary>
    /// 警告类
    /// </summary>
    class Alarm : AbstractAlarm
    {
        //观察者依赖被观察者

        private Heater heater;
        private String message;

        public Alarm(Heater heater1, String message1)
        {
            this.heater = heater1;
            this.message = message1;
        }

        public override void Update()
        {
            Console.WriteLine("当前温度是{0}度,请{1}加温",heater.Wendu,message);
        }

    }

  client:

    class Program
    {
        static void Main(string[] args)
        {
            Heater h1 = new Heater();
            h1.Attach(new Alarm(h1, "停止"));
            h1.Wendu = 100;

            h1.Notify();
            Console.Read();

        }
    }

  执行结果:

【.Net&&观察者】小结:

  细致想想.Net中的托付和观察者模式似乎有着异曲同工之妙。步骤也近乎一样:

声明托付(被观察者)===》》》注冊对象事件(抽象被观察者,不论什么在此注冊的观察者都会被通知)===》》》将被托付的事件进行注冊===》》》托付事件响应,运行被托付事件(被观察者状态改变,观察者进行对应变化)。

时间: 2024-10-12 23:40:28

托付和观察者模式的相关文章

用java观察者模式解耦经典三层架构

三层架构是一个很经典的架构模式,依据系统的职责不同.将系统分成了表现层,逻辑层和数据訪问层,而且配合数据实体进行传输数据,能够大大的封装性和复用性. 经典的三层架构图: 我们再深入到架构图内部.看看详细的类图,用简单的登陆举例吧: 这里通过LoginUI.调用了LoginLogService和LoginVerificationService两个类.通过类图能够看得出,U层和Service层(本文把BLL层称为了Service层)直接採用了直接调用的方式. 在面向对象的设计中.一直强调要面向接口编

学习日记之观察者模式

观察者模式(公布-订阅 Publish/Subscribe 模式):定义了一种一对多的依赖关系.让多个观察者对象同事监听某一个主体对象.这个主体对象在状态发生变化时,会通知全部观察者对象.使他们可以自己主动更新自己. 1:观察者模式特点 (1),将一个系统切割成一系列相互协作的类有一个非常不好的副作用.那就是须要维护相关对象间的一致性. 我们不希望为了维持一致性而使各类紧密耦合,这样会给维护.扩展和重用都带来不便. (2),当一个对象改变须要同一时候改变其它对象的时候,并且它不知道详细有多少对象

C#托付和事件

C#托付.我看了非常长时间的资料和帖子, 曾经对托付的理解就是托付事实上就是将一个方法作为參数传递给第一个方法. 如今对托付的认识则变了一些的,托付能够实现: 1.在两个不能直接调用的方法之间做为桥梁 2.当不知详细实现什么的时候适用托付(如事件) 使用一个托付时.须要两个步骤: 1.定义一个托付,就像是定义一个类一样: 2.实例化一个或多个该托付. 3.为托付注冊方法. 在定义托付的时候,往往会在某类的外部创建,而且是public(相当于全局变量.由于声明托付的目的就是为了把它暴露在类的cli

大话设计模式之观察者模式

从前,有个放羊娃.每天都去山上放羊,一天,他认为十分无聊.就想了个捉弄大家寻开心的主意. 他向着山下正在种田的农夫们大声喊:"狼来了!狼来了!救命啊! "农夫们听到喊声急忙拿着锄头和镰刀往山上跑,他们边跑喊:"不要怕,孩子,我们来帮你打恶狼!"农夫们气喘吁吁地赶到山上一看,连狼的影子也没有!放羊娃哈哈大笑:"真有意思,你们上当了! "农夫们生气地走了.第二天,放羊娃故伎重演,善良的农夫们又冲上来帮他打狼,可还是没有见到狼的影子. 放羊娃笑得直不起

再看C#中的托付和事件

在一口一个设计模式--观察者模式中.我们已经知道怎样应用观察者模式,但通过近期的深入学习,发现观察者模式存在下面缺陷: 1.抽象通知者依赖于抽象观察者: 2.每一个详细观察者被调用的方法必须一致. 比方在机房收费系统中关于观察者模式的应用例如以下图所看到的: 这个设计存在下面问题: 1.抽象通知者须要把抽象观察者中的全部详细对象加入到集合中,以备向每一个详细观察者发送通知消息. 2.在发送通知消息时.详细观察者中被通知的方法必须一致,否则详细通知者无法完毕遍历: 3.更新卡内剩余金额.更新学生上

面向对象的思想 泛型和托付

面向对象是一种思想,他的技术体现,能够体如今代码中使用泛型,方法与方法之间的调用不是直接调用,而是使用托付. 使用了泛型,就能够不用考虑数据的类型,从而做到统一的处理.就比方我们曾经写代码,每一个实体类相应一个DAL,然后每一个DAL里面都有增删改查的方法,每一个方法都是针对固定的类型来做的.如Update实体A,则一定仅仅能更新实体A.可是使用了泛型就能够Update(<T>),这个T是什么类型,仅仅要你指定什么类型,他就是什么类型,T是实体A,就更新实体A,T是实体B就更新实体B. 仅仅要

观察者模式

观察者模式:一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现. 观察者 (Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(List)里. 被观察者 被观察对象(Subject)发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者. 代码实例: //被观察者接口 public interface Subject { void add(Observer observer

ExtJS要利用观察者模式 去实现自定义的事件

1 // 要利用观察者模式 去实现自定义的事件 2 3 4 //1:由于浏览器他自己能定义内置的事件(click/blur...) 5 // 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事件) 6 var Observable = function(){ 7 //承装自己所定义的事件类型的 8 this.events = ['start','stop']; 9 //我们应该设计一种数据类型,这种数据类型就可以去维护自定义事件类型 和 和相关绑定函数的关系,结构如下

【非凡程序员】 OC第十五节课 (观察者模式和KVO进行对比)

今天主要学了观察者模式,以及回顾复习了KVO,两者进行对比 什么是观察者模式? 我们先打个比方,这就像你订报纸.比如你想知道美国最近放生了些新闻,你可能会订阅一份美国周刊,然后一旦美国有了新的故事,美国周刊就发一刊,并邮寄给你,当你收到这份报刊,然后你就能够了解美国最新的动态.其实这就是观察者模式,A对B的变化感兴趣,就注册为B的观察者,当B发生变化时通知A,告知B发生了变化.这是一种非常典型的观察者的用法,我把这种使用方法叫做经典观察者模式 KVO的全称是Key-Value Observer,