java中观察者模式等同于发布订阅模式?

2019-08-03  本文已影响0人  coke613

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。而观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。

举个栗子:童鞋们观察灯.
在此栗子中童鞋们是观察者,而灯是可观察者(被观察者).灯打开或者灯熄灭,童鞋们都能接收得到这个事件.并及时响应该事件做相应处理.

在观察者模式中一般会涉及到几点: 抽象观察者,抽象可观察者.观察者以及可观察者.

代码实现 :张三,李四,王五订阅微信公众号.

// 定义抽象可观察者. 公众号一般会有 订阅,取消订阅,以及通知提醒功能.

public interface Observerable {

    /***
     * 注册事件
     */
    void registerObserver(Observer o);

    /***
     * 取消事件
     */
    void cancleObserver(Observer o);

    /***
     * 更新事件   发送一条推送通知
     */
    void notifynObserver();
}

// 订阅抽象观察者

public interface Observer {
    /***
     * 定义一个update 方法,当被观察者<微信公众号> 发布事件的时候,会执行该方法.
     * @param message
     */
    void update(String message);
}

实体类 可观察者

public class WechatServer implements Observerable {

    private List<Observer> observerList;   // 存储订阅该公众号的observer<观察者 人>
    private String message;

    public WechatServer() {
        observerList = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer o) {
        observerList.add(o);
    }

    @Override
    public void cancleObserver(Observer o) {
        observerList.remove(o);
    }

    /***
     * 通知每一个订阅者 接收消息.
     */
    @Override
    public void notifynObserver() {
        for (int i = 0; i < observerList.size(); i++) {
            Observer observer = observerList.get(i);
            observer.update(message);
        }
    }


    /***
     * 公众号每次推的消息
     */
    public void setInfoMsg(String msg){
        this.message = msg;
         System.out.println("微信公众号推送消息: " + msg);
        // 消息来临   通知每一个订阅者
        notifynObserver();
    }
}

实体类 观察者

public class UserObserverable implements Observer{
    private String name;

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

    @Override
    public void update(String message) {
         System.out.println(name + " 订阅者接收到消息:"+message);
    }
}

如何关联两者之间的关系呢?

        WechatServer server = new WechatServer();
        Observer zhangsan  = new UserObserverable("zhangsan");
        Observer lisi = new UserObserverable("lisi");
        Observer wangwu = new UserObserverable("wangwu");
        server.registerObserver(lisi);
        server.registerObserver(wangwu);
        server.registerObserver(zhangsan);
        server.setInfoMsg("PHP是世上最好的语言");

        server.cancleObserver(lisi);  // 这里取消了订阅
        server.setInfoMsg("flutter 重磅来袭!!");

张三,李四,王五,都订阅了微信公众号.接着公众号推了一条提醒"PHP是世上最好的语言".而然,李四很不爽,取消了微信公众号.公众号继续推了一条了 "flutter 重磅来袭!!" 由于,"flutter 重磅来袭!!" 是在李四取消之后推送的,继而李四不会收到消息.

log打印.png

发布订阅者模式

在发布订阅者模式中,发布者不会直接将消息告知订阅者,而是通过第三种组件来告知.这样一来,发布者与订阅者不存在任何关联.而第三种组件我们称为代理或消息代理或事件总线,它是发布者和订阅关联者,它过滤所有传入的消息并相应地分发给订阅者.
在发布者/订阅者中,发布者和订阅者不需要彼此了解。他们只是在消息队列或代理的帮助下进行通信。

最经典栗子: EventBus


EventBus.png
EventBus使用流程.png

简而言之,这两种模式之间的主要区别可以如下所示:


区别.png

参考文档:https://www.cnblogs.com/viaiu/p/9939301.html

上一篇下一篇

猜你喜欢

热点阅读