• 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();
    
            }
    
          
        }
    
    下来咱们看看结果吧
    
    
      
  • 相关阅读:
    LeetCode-160. Intersection of Two Linked Lists
    LeetCode-328. Odd Even Linked List
    LeetCode-234. Palindrome Linked List
    Trie树
    圆圈中最后剩下的数字
    LeetCode-215. Kth Largest Element in an Array
    n个骰子的和
    DFS & BFS
    ubuntu14.04安装显卡驱动(转载)
    Ubuntu 14.04 配置caffe环境
  • 原文地址:https://www.cnblogs.com/xinyebs/p/2438487.html
Copyright © 2020-2023  润新知