Skip to content

观察者模式

zhangpan edited this page Aug 21, 2021 · 4 revisions

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。

以订阅微信公众号为例:

用户在微信订阅了微信公众号后,会收到公众号的消息推送。如果用户取消了订阅,那么就不会再收到推送。

1.观察者Observer抽象层

观察者订阅公众号后会监听公众号推送的消息,推送后观察者会收到更新。可以抽象出一个观察者接口:

/**
 * 观察者抽象层
 */
public interface Observer {
    void update(String obj);
}

2.观察者实现

用户实现观察者接口,收到消息后将消息打印:

/**
 * 观察者实现
 */
public class UserObserver implements Observer {

    private String name;
    private String message;

    public UserObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        this.message = message;
        readMessage();
    }

    private void readMessage() {
        System.out.println(name + "收到一条消息:" + message);
    }
}

3.被观察者抽象层

被观察者提供订阅、取消订阅、发布消息、以及发布消息后通知观察者的功能:

/**
 * 被观察者抽象层
 */
public interface Observable {
    void addObserver(Observer observer);

    void removeObserver(Observer observer);

    void notifyObservers();

    // 发布消息
    void pushMessage(String message);
}

4.被观察者实现

定义一个公众号的被观察者,并实现Observable:

/**
 * 被观察者
 */
public class WechatObservable implements Observable {

    private final List<Observer> list = new ArrayList<>();
    private String message;

    @Override
    public void addObserver(Observer observer) {
        list.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        list.remove(observer);
    }


    @Override
    public void notifyObservers() {
        for (Observer observer : list) {
            observer.update(message);
        }
    }

    @Override
    public void pushMessage(String message) {
        this.message = message;
        // 通知订阅的用户
        notifyObservers();
    }
}

5.测试代码

public class ObserverTest {

    public static void main(String[] args) {
        WechatObservable wechatObservable = new WechatObservable();
        UserObserver ryan = new UserObserver("Ryan");
        UserObserver frank = new UserObserver("Mike");

        wechatObservable.addObserver(ryan);
        wechatObservable.addObserver(frank);

        wechatObservable.pushMessage("第三次分配来了!实现共同富裕再放大招!");
    }
}

打印结果:

Ryan收到一条消息:第三次分配来了!实现共同富裕再放大招!
Mike收到一条消息:第三次分配来了!实现共同富裕再放大招!

公众号:玩转安卓Dev

Java基础

面向对象与Java基础知识

Java集合框架

JVM

多线程与并发

设计模式

Kotlin

Android

Android基础知识

Android消息机制

Framework

View事件分发机制

Android屏幕刷新机制

View的绘制流程

Activity启动

性能优化

Jetpack&系统View

第三方框架实现原理

计算机网络

算法

其它

Clone this wiki locally