鱼C论坛

 找回密码
 立即注册
查看: 1941|回复: 1

java设计模式之内容观察者

[复制链接]
发表于 2015-4-18 11:30:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
   观察者模式定义了对象之间一对多的关系,可观察者用一个共同的接口来更新观察者,观察者与可观察者用松耦合方式结合,可观察着不知道观察者的细节,只知道观察者实现了观察者的接口。
   OO原则:1  封装变化--找出程序中会变化的方面,然后将其和固定不变的方面相分离。
                        2  针对接口编程,不针对实现编程。
                        3  多用组合,少用继承。
                        4  为交互对象之间的松耦合设计而努力。
代码贴:
     首先,定义一个可观察者的接口:Subject.java
            
  1. package com.godinsec.liu.in;

  2. public interface Subject {

  3.         public void registerObserver(Observer o);
  4.         public void removeObserver(Observer o);
  5.         public void notifyObservers();
  6. }
复制代码

   然后定义观察者的接口:Observer.java
  1. package com.godinsec.liu.in;

  2. public interface Observer {

  3.         public void update(float temp, float humidity, float pressure);
  4. }
复制代码
然后定义显示数据的接口:
  1. package com.godinsec.liu.in;

  2. public interface DisplayElement {
  3.         public void display();
  4. }
复制代码
下面通过实现可观察者与观察者的接口来通知观察者:
  1. package com.godinsec.liu.data;

  2. import java.util.ArrayList;

  3. import com.godinsec.liu.in.Observer;
  4. import com.godinsec.liu.in.Subject;

  5. public class WeatherData implements Subject{

  6.         private ArrayList observers;
  7.         private float temperature;
  8.         private float humidity;
  9.         private float pressure;
  10.        
  11.         public WeatherData(){
  12.                 observers = new ArrayList();
  13.         }
  14.        
  15.         @Override
  16.         public void registerObserver(Observer o) {
  17.                 // TODO Auto-generated method stub
  18.                 observers.add(o);
  19.         }

  20.         @Override
  21.         public void removeObserver(Observer o) {
  22.                 // TODO Auto-generated method stub
  23.                 int i = observers.indexOf(o);
  24.                 if(i >= 0){
  25.                         observers.remove(i);
  26.                 }
  27.         }

  28.         @Override
  29.         public void notifyObservers() {
  30.                 // TODO Auto-generated method stub
  31.                 for(int i=0; i < observers.size(); i++){
  32.                         Observer observer = (Observer) observers.get(i);
  33.                         observer.update(temperature, humidity, temperature);
  34.                 }
  35.         }
  36.        
  37.         public void measurementschanged(){
  38.                 notifyObservers();
  39.         }
  40.        
  41.         public void setMeasurements(float temperature,float humidity,float pressure){
  42.                 this.temperature = temperature;
  43.                 this.humidity = humidity;
  44.                 this.pressure = pressure;
  45.                 measurementschanged();
  46.         }
  47. }
复制代码
  1. package com.godinsec.liu.data;

  2. import com.godinsec.liu.in.DisplayElement;
  3. import com.godinsec.liu.in.Observer;
  4. import com.godinsec.liu.in.Subject;

  5. public class CurrentConditionsDisplay implements Observer, DisplayElement{

  6.         private float temperature;
  7.         private float humidity;
  8.         private Subject weatherData;
  9.        
  10.         public CurrentConditionsDisplay(Subject weatherData){
  11.                 this.weatherData = weatherData;
  12.                 weatherData.registerObserver(this);
  13.         }
  14.        
  15.         @Override
  16.         public void update(float temp, float humidity, float pressure) {
  17.                 // TODO Auto-generated method stub
  18.                 this.temperature = temp;
  19.                 this.humidity = humidity;
  20.                 display();
  21.         }
  22.        
  23.         @Override
  24.         public void display() {
  25.                 // TODO Auto-generated method stub
  26.                 System.out.println("Current conditions:" + temperature
  27.                                 + "F degrees and " + humidity + "% humidity");
  28.         }


  29. }
复制代码

这样的话,可观察者与观察者的类写完了,然后就是测试类了:
  1. package com.godinsec.liu.data;

  2. public class WeatherStation {
  3.         public static void main(String args[]){
  4.                 WeatherData weatherData = new WeatherData();
  5.                 CurrentConditionsDisplay currentConditionsDisplay =
  6.                                 new CurrentConditionsDisplay(weatherData);

  7.                 weatherData.setMeasurements(80, 65, 30.4f);
  8.                 weatherData.setMeasurements(80.2f, 45, 34.7f);
  9.                 weatherData.setMeasurements(90, 23, 67.6f);
  10.         }
  11. }
复制代码



评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
拈花小仙 + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-4-18 13:54:18 | 显示全部楼层
大神锕。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 18:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表