美文网首页
java中观察者模式等同于发布订阅模式?

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

作者: coke613 | 来源:发表于2019-08-03 14:33 被阅读0次

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

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

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

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

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

    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

    相关文章

      网友评论

          本文标题:java中观察者模式等同于发布订阅模式?

          本文链接:https://www.haomeiwen.com/subject/vfdjdctx.html