鱼C论坛

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

java设计模式之内容观察者

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

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

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

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

public interface Subject {

        public void registerObserver(Observer o);
        public void removeObserver(Observer o);
        public void notifyObservers();
}
   然后定义观察者的接口:Observer.java
package com.godinsec.liu.in;

public interface Observer {

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

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

import java.util.ArrayList;

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

public class WeatherData implements Subject{

        private ArrayList observers;
        private float temperature;
        private float humidity;
        private float pressure;
        
        public WeatherData(){
                observers = new ArrayList();
        }
        
        @Override
        public void registerObserver(Observer o) {
                // TODO Auto-generated method stub
                observers.add(o);
        }

        @Override
        public void removeObserver(Observer o) {
                // TODO Auto-generated method stub
                int i = observers.indexOf(o);
                if(i >= 0){
                        observers.remove(i);
                }
        }

        @Override
        public void notifyObservers() {
                // TODO Auto-generated method stub
                for(int i=0; i < observers.size(); i++){
                        Observer observer = (Observer) observers.get(i);
                        observer.update(temperature, humidity, temperature);
                }
        }
        
        public void measurementschanged(){
                notifyObservers();
        }
        
        public void setMeasurements(float temperature,float humidity,float pressure){
                this.temperature = temperature;
                this.humidity = humidity;
                this.pressure = pressure;
                measurementschanged();
        }
}
package com.godinsec.liu.data;

import com.godinsec.liu.in.DisplayElement;
import com.godinsec.liu.in.Observer;
import com.godinsec.liu.in.Subject;

public class CurrentConditionsDisplay implements Observer, DisplayElement{

        private float temperature;
        private float humidity;
        private Subject weatherData;
        
        public CurrentConditionsDisplay(Subject weatherData){
                this.weatherData = weatherData;
                weatherData.registerObserver(this);
        }
        
        @Override
        public void update(float temp, float humidity, float pressure) {
                // TODO Auto-generated method stub
                this.temperature = temp;
                this.humidity = humidity;
                display();
        }
        
        @Override
        public void display() {
                // TODO Auto-generated method stub
                System.out.println("Current conditions:" + temperature
                                + "F degrees and " + humidity + "% humidity");
        }


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

public class WeatherStation {
        public static void main(String args[]){
                WeatherData weatherData = new WeatherData();
                CurrentConditionsDisplay currentConditionsDisplay = 
                                new CurrentConditionsDisplay(weatherData);

                weatherData.setMeasurements(80, 65, 30.4f);
                weatherData.setMeasurements(80.2f, 45, 34.7f);
                weatherData.setMeasurements(90, 23, 67.6f);
        }
}


评分

参与人数 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-12-22 12:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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