注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 一个黑客与一个电脑白痴的..
 帮助

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


2008-07-24 14:06:53
 标签:学习 设计 模式   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。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


附件下载:
  1
  2




    文章评论
 
2008-07-25 11:22:37
恩 很喜欢交互性的设计。

2008-07-25 13:54:53
很牛 能写这么多这么详细
学习!

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: