设计模式学习--观察者模式

      最近在看Header First 设计模式,感觉收获很大,就把其中的例子,用代码记录下。

出版者+订阅者=观察者模式

出版者--Subject

订阅者--Observer

以气象站公告板为例

温度感应装置|
                      |                  取得数据                                 显示
湿度感应装置|---- 气象站<--------------WeatherData对象-------->|显示装置
                      |
气压感应装置|

主题接口

package com.mq.designmode.observer;

public interface Subject {

   public void registerObserver(Object object);

   public void removeObserver(Object object);

   public void notifyObservers();
}

观察者接口

package com.mq.designmode.observer;

public interface Observer {

   public void update(float temp, float humidity, float pressure);
}
package com.mq.designmode.observer;

public interface DisplayElement {

   public void display();
}

具体实现类

主题实现类

package com.mq.designmode.observer;

import java.util.ArrayList;

public class WeatherData implements Subject {

   //温度
   private float temperature;

   //湿度
   private float humidity;

   //压力
   private float pressure;

   private ArrayList observers;

   public WeatherData(){
      observers = new ArrayList();
   }

   @Override
   public void registerObserver(Object object) {
      observers.add(object);
   }

   @Override
   public void removeObserver(Object object) {
      int i = observers.indexOf(object);
      if(i >= 0){
         observers.remove(i);
      }
//    observers.remove(object);
   }

   @Override
   public void notifyObservers() {
      for(int i = 0; i < observers.size(); i++){
         Observer observer = (Observer) observers.get(i);
         observer.update(temperature, humidity, pressure);
      }
   }

   public void measurementsChanged(){
      notifyObservers();
   }

   /**
    * 设置具体条件值
    * @param temperature
    * @param humidity
    * @param pressure
    */
   public void setMeasurements(float temperature, float humidity, float pressure){
      this.temperature = temperature;
      this.humidity = humidity;
      this.pressure = pressure;
      measurementsChanged();
   }

   //其它方法
}

观察者实现类
package com.mq.designmode.observer;

public class CurrentConditionsDisplay implements Observer, DisplayElement {

   private float temperature;

   private float humidity;

   private Subject weatherData;

   public CurrentConditionsDisplay(Subject subject) {
      this.weatherData = subject;
      this.weatherData.registerObserver(this);
   }



   @Override
   public void update(float temp, float humidity, float pressure) {
      this.temperature = temp;
      this.humidity = humidity;
      display();
   }

   @Override
   public void display() {
      System.out.println("Current condition: "+ temperature + " F degrees and "
      + humidity +"% humidity ");
   }
}

测试类

package com.mq.designmode.observer;

public class WeatherStation {

   /**
    * 出版者+订阅者=观察者模式
    *
    */

   public static void main(String[] args) {
      WeatherData weatherData = new WeatherData();
      CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
      weatherData.setMeasurements(22, 25 ,50);
      weatherData.setMeasurements(32, 35 ,56);
      weatherData.setMeasurements(18, 45 ,60);
   }
}

运行结果:

 

设计原则:针对接口编程,不针对实现编程

设计原则:多用组合,少用继承

设计原则:找出程序中会变化的方面,然后将其与固定不变的方面相分离

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值