Java-观察者模式(订阅-发布者模式)

作者 : 开心源码 本文共2724个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共191人阅读

定义

观察者模式也叫订阅-发布者模式,是一种一对一或者者一对多的依赖关系,当一个对象改变状态,依赖它的对象会收到通知并自动升级。

观察者模式的结构

观察者模式主要由四个主要部分构成
(1)主题(Subject):主题也叫笼统被观察者,是一个接口,该接口规定了具体主题需要实现的方法,比方,增加、删除观察者以及通知观察者升级数据的笼统方法。
(2)观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来升级数据的方法。
(3)具体主题(ConcreteSubject):具体主题也叫具体被观察者,是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。具体主题需使用一个集合,比方ArrayList,存放观察者的引用,以便数据变化时及时通知具体观察者。
(4)具体观察者(ConcreteObserver):实现笼统观察者角色所需要的升级接口,对具体主题通知做出改变。

浅显点就是:主题发布信息,观察者获取信息,他们关联了就能收到信息,没有关联就收不到信息。
如图:

image.png

观察者模式的适用的场景

假如你想一个对象的数据升级时需要通知其余对象,让其余对象对通知做出改变,那么观察者模式比较实用。

代码部分

场景:假设张三和李四买彩票,时刻关注彩票中心的消息,其中一个人中奖,很高兴,另一个人不开心,取消了对彩票中心的关注,就再也收不到彩票中心的消息了。
在这个模拟中彩票中心就是主题(Subject),张三和李四就是观察彩票中心消息的具体观察者(ConcreteObserver)。对彩票消息做出行为。

Subject接口相关代码

/** * 形容:笼统主题(笼统被观察者) */public interface Subject {    /**     * 注册观察者     * @param observer 观察者     */     void registerObserver(Observer observer);    /**     * 移除观察者     * @param observer 观察者     */     void removeObserver(Observer observer);    /**     * 在状态发生变化通知观察者     */    void notifyObserver(String message);}

Observer接口相关代码

/** * 形容:笼统观察者 */public interface Observer {    /**     * 当被观察者调用notifyObservers()方法时,观察者的update()方法会被回调。     * @param message 通知内容     */     void update(ConcreteObserver observer,String message);}

ConcreteSubject类相关代码

/** * 形容:具体主题实现类 */public class ConcreteSubject implements Subject {    //创立集合用来存放观察者对象    List<Observer> mObserverList;    public ConcreteSubject() {       mObserverList = new LinkedList<>();    }    //注册观察者,也就是将观察者放到集合中    @Override    public void registerObserver(Observer observer) {        mObserverList.add(observer);    }    //移除观察者,也就是将观察者从集合中移除    @Override    public void removeObserver(Observer observer) {            mObserverList.remove(observer);    }    //状态改变,通知观察者    @Override    public void notifyObserver(String message) {        //遍历通知所有观察者        for(int i =0;i<mObserverList.size();i++){            //此处进行了强转            mObserverList.get(i).update((ConcreteObserver)mObserverList.get(i),message);        }    }    /**     * 通知内容     * @param message     */    public void sendMessage(String message){        notifyObserver(message);    }}

ConcreteObserver类相关代码

/** * 形容:具体观察者,对Subject的通知执行具体操作 */public class ConcreteObserver implements Observer {    private static final String TAG = "ConcreteObserver";    //客户名   String name;   //中奖号码    String number;    public ConcreteObserver(String name,String work) {        this.name = name;        this.number=work;    }    @Override    public void update(ConcreteObserver observer,String message) {        if(observer.number.equals(message)){            Log.e(TAG, observer.name+"的号码是:" +observer.number+"中奖号码是"+message+"他很高兴");        }else{            Log.e(TAG, observer.name+"的号码是:" +observer.number+"中奖号码是"+message+"不很高兴");        }    }}

测试相关代码

    //创立主题实例        ConcreteSubject concreteSubject =new ConcreteSubject();        ConcreteObserver zhansan =new ConcreteObserver("张三","111111");        ConcreteObserver lisi  =new ConcreteObserver("李四","222222");        concreteSubject.registerObserver(zhansan);        concreteSubject.registerObserver(lisi);        //设置中奖号码        concreteSubject.sendMessage("111111");        //移除观察者李四        concreteSubject.removeObserver(lisi);        //设置中奖号码        concreteSubject.sendMessage("222222");

测试结果:

image.png

尽管现在观察者模式不常用了,更多人选择Rx等框架实现即时升级,但我们肯定要了解其本质和核心思想。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Java-观察者模式(订阅-发布者模式)

发表回复