学习设计模式之旅 / 观察者(Observers)委托实现..
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://maddish.blog.51cto.com/282288/89341 |
首先我们复习下之前的观察者模式概念和原则 然后还是以气象监测应用系统演示。
观察者模式(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"); } } } 本文出自 “maddish” 博客,请务必保留此出处http://maddish.blog.51cto.com/282288/89341 本文出自 51CTO.COM技术博客 |




namespace Exercise.BureauOfMeteorology 
1
maddish
博客统计信息
热门文章
最新评论
友情链接