学习设计模式之旅 / 观察者(Observers)委托实现..

首先我们复习下之前的观察者模式概念和原则 然后还是以气象监测应用系统演示。
       观察者模式(Observers)  定义了对象之间的一对多依赖,这个一来,当一个对象改变状态时,它所有的依赖者都会收到通知并自动更新,主题和观察者定义了一对多的关系 观察者依赖于主题,只要主题状态一有改变,观察者就会接受到通知 根据通知的风格;
       当两个对象之间松耦合,它们依然可以交互,但不太清除彼此的细节。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。主题只知道观察者实现了某个接口(也就是Observer接口)主题不需要知道观察者的具体类是谁,做了些什么或其他的任何细节。任何时候我们可以添加新的观察者。因为主题唯一依赖的东西是一个实现Observer接口的对象列表。
      松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。所以我们 为了交互对象之间的松耦合设计而在努力。
Demo - 气象监测应用系统
     气象观测局专利申请在WeatherData对象中,由WeatherData负责追踪天气状态。成功以后以供布告板显示,由可能很多不同的布告板,每个布告板的显示都有所不同,并且当Weather对象得到新的数据时,所有布告板都必须更新。
 
namespace Exercise.BureauOfMeteorology
{
     class WeatherData  
    {
         public delegate void UpdateDisplay( object sender, args e);

         public event UpdateDisplay UpdateEvent;

         public void SetMeasurements( float t, float h, float p)
        {
            args e = new args(t, h, p);

            Console.WriteLine( "Began to inform all observers ..");

             if (UpdateEvent != null)
            {
                UpdateEvent( this, e);
            }

            Console.WriteLine( "End to all observers ..");
        }

         public class args : EventArgs
        {
             private float temperatrue;

             public float Temperatrue
            {
                get { return temperatrue; }
                set { temperatrue = value; }
            }
             private float humidity;

             public float Humidity
            {
                get { return humidity; }
                set { humidity = value; }
            }
             private float pressure;

             public float Pressure
            {
                get { return pressure; }
                set { pressure = value; }
            }

             public args( float t, float h, float p)
            {
                 this.temperatrue = t;
                 this.humidity = h;
                 this.pressure = p;
            }
        }
    }
}

namespace Exercise.BureauOfMeteorology.Display
{
     class CurrentConditions
    {
         public CurrentConditions(WeatherData weatherData)
        {
            weatherData.UpdateEvent += new WeatherData.UpdateDisplay(Display);
        }

         public void Display( object sender, WeatherData.args e)
        {
            Console.WriteLine(
                 "CurrentConditions : " + e.Temperatrue +
                     "  F degrees and " + e.Humidity + "% humidity");
        }
    }
}
namespace Exercise.BureauOfMeteorology.Display
{
     class Forecast
    {
         public Forecast(WeatherData weatherData)
        {
            weatherData.UpdateEvent += new WeatherData.UpdateDisplay(Display);
        }

         public void Display( object sender, WeatherData.args e)
        {
            Console.WriteLine(
                 "Forecast : " + e.Temperatrue +
                     "  F degrees and " + e.Humidity + "% humidity");
        }
    }
}


你可能感兴趣的:(模式,学习,职场,设计,休闲)