设计模式-17观察者模式

观察者模式

原理:

观察者模式类似于定牛奶业务

subject:等级、移除、通知

  • registerObserver:注册
  • removeObserver:移除
  • notifyObservers:通知所有的注册的用户,根据需求不同,可以更新数据,让用户来取,也可能是实施推送,看具体需求而定

observer:接收输入,主要是update()方法

观察者模式:对象之间多对一的一种设计方案,被依赖的对象为subject,依赖的对象为observer,subject通知Observer变化,比如这里的奶站是subject,是1的一方,用户是Observer,是多的一方

案例:

实现一个不同网站请求天气网站,获取天气不断变化的功能
类图:
在这里插入图片描述

/**
 * 主题接口
 */
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObserver();
}

/**
 * 主题类
 */
public class WeatherData implements Subject {

    private int temperature;
    private int pressure;
    private int humidity;

    private List<Observer> observers = new ArrayList<>();

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

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

    @Override
    public void notifyObserver() {
        for (Observer o: observers) {
            o.update(temperature,pressure,humidity);
        }
    }
    //气温变化,通知所有订阅者
    public void setCondition(int temperature,int pressure,int humidity){
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        notifyObserver();
    }
}

//观察者
public interface Observer {
    void update(int temperature,int pressure,int humidity);
}

/**
 * 具体订阅者
 */
public class Sina implements Observer {

    private int temperature;
    private int pressure;
    private int humidity;

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

    private void display() {
        System.out.println("这里是新浪网站");
        System.out.println("========temperature is ======" + temperature + "==============");
        System.out.println("========pressure is =======" + pressure + "=============");
        System.out.println("========humidity is ======" + humidity + "=============");
    }
}


/**
 * 具体订阅者
 */
public class Baidu implements Observer {

    private int temperature;
    private int pressure;
    private int humidity;

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

    private void display() {
        System.out.println("这里是百度网站");
        System.out.println("========temperature is ======" + temperature + "==============");
        System.out.println("========pressure is =======" + pressure + "=============");
        System.out.println("========humidity is ======" + humidity + "=============");
    }
}

 
public class Client {

    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();
        Sina sina = new Sina();
        Baidu baidu = new Baidu();

        weatherData.registerObserver(sina);
        weatherData.registerObserver(baidu);

        System.out.println("通知各个观察者,看看信息");
        weatherData.setCondition(10,100,30);

        weatherData.removeObserver(baidu);
        weatherData.notifyObserver();

    }
}
源码使用:

观察者模式在JDK中的源码分析:

  • JDK中的Observable类就使用了观察者模式

角色分析:

  • Observable的作用和地位等价于我们前面讲过的Subject
  • Observable是类不是借口,类中已经实现了核心的方法,即管理Observer的方法add。。delete。。notify等
  • Observer 的作用和地位等价于我们讲过的Observer,有update方法
  • Observable和Observer的使用方法和前面讲过的一样,只是Observable是类,通过继承来实现观察者模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值