Multicast委托和Observer模式——委托系列二

     在c#中multicast委托实现一个通用的模式,目的是避免大量的手工代码,这个模式成为observer或者是publish-subscribe模式,它要应对这样一种情形:你需要将单一的事件通知(比如对象状态发生的一个变化)广播给多个订阅者。
   

    下面以一个温度控制的例子,在这个假象的情形中,一个加热器(heater)一个冷却器(cooler)连接到一个自动调温器。

为了控制加热器和冷却器的打开和关闭,要向他们通知温度的变化,调温器自动将温度的变化发布给多个订阅者--也就是加热器和冷却器。

首先定义加热器(Herter)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Herter
    {
        public Herter(float temperature)
        {//构造函数
            Temperature = temperature;
        }

        public float Temperature
        {//属性
            get { return _Temperature; }
            set { _Temperature = value; }
        }

        private float _Temperature;

        public void onTemperatureChange(float newTemperature)
        {
            if (newTemperature > Temperature)
            {
                Console.WriteLine("Heater:关闭");
            }
            else
            {
                Console.WriteLine("Heater:打开");
            }
        }
    }
}

 

在定义冷却器(cooler)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Cooler
    {
        public Cooler(float temperature)
        {//构造函数
            Temperature = temperature;//初始化属性
        }

        public float Temperature //属性
        {
            get { return _Temperature; }
            set { _Temperature = value; }//给字段赋值
        }
        private float _Temperature;

        public void onTemperatureChange(float newTemperature)
        {
            if (newTemperature > Temperature)
            {
                Console.WriteLine("Cooler:打开");
            }
            else
            {
                Console.WriteLine("Cooler:关闭");
            }
        }

 

    }
}

在定义调温器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Thermostat
    {
        //定义委托,定义了订阅者的方法的签名
        public delegate void TemperatureChangeHandler(float newTemperature);
       
        //委托类型的属性,用来存储订阅者列表,注意:只需要一个委托字段即可存储所有订阅者
        public TemperatureChangeHandler OnTemperatureChange
        {
            get { return _OnTemperatureChange; }
            set { _OnTemperatureChange = value; }
        }

        private TemperatureChangeHandler _OnTemperatureChange;

        public float CurrentTemperature
        {
            get { return _CurrentTemperature; }
            set {
                if(value!=CurrentTemperature)
                {
                    _CurrentTemperature = value;
                    OnTemperatureChange(value);
                    //这个语句将温度的变化发布给冷却器和加热器对象,我们只是执行了一个调用,即可以向订阅者发出通知
                }
            }
        }

        private float _CurrentTemperature;
    }
}

最后是调用

class Program
    {
        static void Main(string[] args)
        {
          
          


            Thermostat thermostat = new Thermostat();
            Herter heater = new Herter(60);
            Cooler cooler = new Cooler(80);
            string temperature;

            thermostat.OnTemperatureChange += heater.onTemperatureChange;
            thermostat.OnTemperatureChange += cooler.onTemperatureChange;
            Console.WriteLine("请输入温度");

            temperature = Console.ReadLine();
            thermostat.CurrentTemperature = int.Parse(temperature);
            Console.ReadKey();

        }

      
    }

下来咱们看看结果吧


  
posted @ 2012-04-09 10:03  xinyebs  阅读(629)  评论(0编辑  收藏  举报