Java设计模式 - 观察者模式

目录

观察者模式:

观察者模式优点:

观察者模式应用:

观察者实例:

上述代码 GitHub 地址:https://github.com/baicun/designPatterns


观察者模式:

对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化。

观察者模式优点:

第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。

由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。

第二、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,

观察者模式应用:

Spring ApplicationContext 机制中的观察者模式

JDK 委托事件模型DEM中的观察者模式

观察者实例:

类图:

观察者接口:

public interface Observer {
    public void update(float mTemperature, float mPresure, float mHumidity);
}

A观察者实现类:

public class CurrentConditionsA implements Observer{

    private float mTemperature;
    private float mPresure;
    private float mHumidity;

    public void update(float mTemperature, float mPresure, float mHumidity){
        this.mTemperature = mTemperature;
        this.mPresure = mPresure;
        this.mHumidity = mHumidity;
        display();
    }

    public void display(){
        System.out.println("今天的温度:"+mTemperature);
        System.out.println("今天的气压:"+mPresure);
        System.out.println("今天的湿度:"+mHumidity);
    }

}

B观察者实现类: 

public class CurrentConditionsB implements Observer{

    private float mTemperature;
    private float mPresure;
    private float mHumidity;

    public void update(float mTemperature, float mPresure, float mHumidity){
        this.mTemperature = mTemperature;
        this.mPresure = mPresure;
        this.mHumidity = mHumidity;
        display();
    }

    public void display(){
        System.out.println("明天的温度:"+mTemperature);
        System.out.println("明天的气压:"+mPresure);
        System.out.println("明天的湿度:"+mHumidity);
    }

}

 被观察者接口:

public interface Subject {
    //观察者注册
    public void  registerObserver(Observer observer);
    // 观察者移除
    public void  removeObserver(Observer observer);
    // 观察者通知
    public void  notifyObserver();
}

被观察者接口实现:

public class WeatherData implements Subject {
    private float mTemperature;
    private float mPresure;
    private float mHumidity;
    private ArrayList<Observer> observerArrays;

    public WeatherData(){
        observerArrays = new ArrayList<Observer>();
    }

    public float getmTemperature() {
        return mTemperature;
    }

    public void setmTemperature(float mTemperature) {
        this.mTemperature = mTemperature;
    }

    public float getmPresure() {
        return mPresure;
    }

    public void setmPresure(float mPresure) {
        this.mPresure = mPresure;
    }

    public float getmHumidity() {
        return mHumidity;
    }

    public void setmHumidity(float mHumidity) {
        this.mHumidity = mHumidity;
    }

    public void dataChange(){
        notifyObserver();
    }

    public void setData(float mTemperature, float mPresure, float mHumidity){
        this.mTemperature = mTemperature;
        this.mPresure = mPresure;
        this.mHumidity = mHumidity;
        dataChange();
    }

    @Override
    public void registerObserver(Observer observer) {
        observerArrays.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        if(observerArrays.contains(observer)){
            observerArrays.remove(observer);
        }
    }

    @Override
    public void notifyObserver() {
        for(Observer obs : observerArrays){
            obs.update(getmTemperature(),getmPresure(),getmHumidity());
        }
    }
}

通过通知接口,实现观察者通知 

测试类:

public class mainTest {
    public static  void main(String[] args){
        WeatherData weatherData = new WeatherData();
        CurrentConditionsA currentConditionsA = new CurrentConditionsA();
        CurrentConditionsB currentConditionsB = new CurrentConditionsB();
        weatherData.registerObserver(currentConditionsA);
        weatherData.registerObserver(currentConditionsB);

        weatherData.setData(30,150,60);

        weatherData.removeObserver(currentConditionsA);
        weatherData.setData(90,350,70);
    }
}

 

上述代码 GitHub 地址:https://github.com/baicun/designPatterns

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值