【学习笔记】设计模式-观察者模式

前言

本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录

观察者模式定义

定义了对象之间的一对多依赖,这样一来,当一个对象改变状态的时候,她的所有依赖着都会收到通知并自动更新。

需求

气象站需要想订阅温度数据的客户推送温度数据,请用观察者模式实现

需求分析

这里是一个一对多的关系,且必须是订阅的客户才可以收到这个数据。
即气象站:需要提供注册接口,和消息通知接口
客户即观察者:需要有接收消息的接口

开发

主题基类接口

/**
*   主题/服务端,负责给已注册的观察者发布消息
*/
public interface Subject {
    public void registerOberver(Observer o);

    public void removeOberver(Observer o);

    // 通知消息/push消息给观察者
    public void notifyObservers();

}

其对应实现者-气象站数据

public class WeathData implements Subject {

    private ArrayList<Observer> list;

    public void WeathData() {
        list = new  ArrayList<>();
    }

    public void registerOberver(Observer o){
        list.add(o);
    }

    public void removeOberver(Observer o){
        int i = list.indexOf(o);
        if(i >= 0) {
            list.remove(o);
        }
    }

    public void notifyObservers(){
        for(Observer o: list){
            o.update(getTempTestData());
        }
    }

    public float getTempTestData(){
        return 26.0;
    }

    // 自己做个小按钮更新数据进行模拟
    public void dataChangeByTest(){
        notifyObservers()
    }

}

观察者基类接口

/**
*   观察者接口
*/
public interface Observer {
    public void update(float temp)
}

其对应实现者观察者

public class MyObserver implements Observer {
    private Subject mWeathData;

    public void MyObserver(Subject mWeathData) {
        this.mWeathData = mWeathData;
        // 向气象数据中心注册观察者,便于接收消息
        this.mWeathData.registerOberver(this);
    }

    public void update(float temp) {
        // 显示温度
    }
}

跑一跑Demo

class OberserPattern 
{
    public static void main(String[] args) 
    {
        System.out.println("Hello World!");

        // 建立气象数据站
        Subject mWeathData = new WeathData();

        // 建立观察者,观察者向气象数据站注册,以便接收温度数据
        Observer mMyObserver = new MyObserver(mWeathData);

        // 模拟一个温度下发事件,即可看到观察者接收到数据了
        mMyObserver.dataChangeByTest();
    }

}

结语

日常生活中的订阅微信公众号,订阅报纸也是观察者模式。尤其是实际项目代码中也是最频繁用到的模式之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值