码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式

时间:2016-04-14 20:54:23      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

观察者模式 :定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的多有依赖这都会收到通知并自动更新。

   简单的说这种模式就像生活中的报社和订阅报纸的人一样  , 如果你订阅了报纸(登记为观察者),报社有有新报纸就会第一时间送给你。如果你退订(撤销观察者),报社将不在通知你

 

技术分享

 

 

实现观察者模式的方法不止一种,但是以保管Subject和Observer接口的设计方式最常见。

技术分享

 

 

下面以一个具体的气象站系统为例子 ,更好的说明这种模式如何使用 

       设计  1确定主题(会改变状态的) ,气象信息(weatherdata)比如 温度,湿度,压力,风速等等

        2设计主题接口  

  

 public interface subject   //主题接口
    {
        public void registerObserver(observer o);  //观察者作为变量,登记观察者
        public void removeObserver(observer o); // 删除观察者
        public void notifyObservers(observer o);//通知 观察者  ,当主题改变时这个方法会被调用通知观察者
    }

     3具体的主题类 

 public class weatherData:subject //具体的主题类实现主题接口
    {
        private ArrayList observers;//添加一个arraylist来记录观察者,在构造函数中实例化
        private float temprature;//添加主题对象需要更新数据的私有字段
        private float humidity;
        private float pressure;
        public weatherData()
        {
            observers = new ArrayList();
        }
        public void registerObserver(observer o) //注册观察者,只需要把它加入到arraylist中
        {
            observers.Add(o);
        }
        public void removeObserver(observer o)// 观察者取消注册时,从list中删除
        {
         //   observers.Remove(o);
            int i = observers.IndexOf(o);
            if (i>=0)
            {
                observers.RemoveAt(i);
            }
        }
        public void notifyObservers()//通知每一个观察者,主题对象的状态改变,需要更新数据
        {
            foreach (observer ob in observers)
            {
                ob.update(temprature, humidity, pressure);  //观察者实现了update方法来更细数据
            }
           
        }
        public void measurementsChanged() //当气象站得到更新的观察值,通知观察者
        {

            notifyObservers();
        }

        public void setMeasurements(float temprature, float humidity, float pressure)//模拟数据更新
        {
            this.temprature = temprature;
            this.humidity = humidity;
            this.pressure = pressure;
            measurementsChanged(); //调用更新通知方法
        }
        //其他方法
    }

      4 确定观察者(需要用到主题状态数据的对象)

                 5 观察者接口

public interface observer   //观察者接口
    {
        public void update(float temp,float humidity,float pressure);
    }

     在添加一个接口用来显示 数据

 

  public interface displayElement   //这个接口只有一个方法用来更新显示数据的
    {
        public void display();
    }

 

      

 6 具体观察者,只举一个例子

 public class CurrentConditionsDisplay:observer,displayElement
    {
        private float humidity; //根据需要选择主题提供的数据
        private float pressure;
        private subject weatherdata;  // 主题对象 ,在构构造函数中实例化 
        public CurrentConditionsDisplay(subject weatherdata)
        {
            this.weatherdata = weatherdata;//私有主题指向具体主题
            weatherdata.registerObserver(this);//登记自己
        }
        public void update(float temp, float humidity, float pressure)
        {
            this.humidity = humidity;  //把更新的数据保存到私有成员中
            this.pressure = pressure;
            display();  //  然后调用display()
        }
        public void display(){
        }

    }

  测试  

         

 protected void Page_Load(object sender, EventArgs e)
        {
            weatherData weatherData = new weatherData();//首先建立一个主题对象
            CurrentConditionsDisplay ccd = new CurrentConditionsDisplay(weatherData);//建立一个观察者登记在主题对象上
            weatherData.setMeasurements(11, 22, 33);//模拟主题对象数据更新 ,然后ccd对象会自动收到通知做出相应动作
            
        }

 总结  : 观察者对象只需要等待通知来做出动作

技术分享

 

       

观察者模式

标签:

原文地址:http://www.cnblogs.com/wangjian920110/p/5392614.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!