zoukankan      html  css  js  c++  java
  • java设计模式(十五)——观察者模式

    1、基本概念

    观察者模式( Observer Pattern ),又叫发布-订阅( Publish/Subscribe )模式、源-监听器( Source/Listener )模式。定义一

    种一对多的依赖关系, 一个主题对象可被多个观察者对象同时监听,使得每当主题对象状态变化时, 所

    有依赖于它的对象都会得到通知并被自动更新。属于行为型模式

    应用场景:微信公众号关注后的消息通知,app的消息通知,app的推送消息等

    2、类图和角色

    类图:

     角色:

    抽象的主题:即抽象的被观察者ISubject,定义了增加,删除,通知观察者的方法

    具体的主题:即具体的被观察者ConcreteSubject,具体的实现,当发生变化时,会通知观察者

    抽象的观察者:IObserver,定义响应通知的方法

    具体的观察者:ConcreteObserver,定义了具体的响应通知方法,对被观察者做出相应的反应

    3、案例

    案例:app推送消息

    类图:

    JDK提供了自带的实现方式来帮助我们更方便的实现观察者模式

    我们的被观察者只需要继承Observable类即可

    具体的被观察者:BoringApp 

    public class BoringApp extends Observable {
    
            public static final String APP_NAME = "无聊app";
    
            public void pushMessage(Message msg){
                System.out.printf("无聊app推送了一条消息:发送人:%s,消息内容%s 
     ——————
    ",msg.getUsername(),msg.getContent());
                setChanged();
                notifyObservers(msg);
            }
    }

    我们的观察者只需要实现Observer接口

    具体的观察者:User

    @Data
    public class User implements Observer {
    
        private String name;
    
        public User(String name){
            this.name = name;
        }
    
        @Override
        public void update(Observable o, Object arg) {
                Message message = (Message)arg;
                System.out.printf("【%s】, 你收到了来自%s的一条信息:%s
    -----
    ", BoringApp.APP_NAME,message.getUsername(),message.getContent());
    
        }
    }

    自定义消息类:

    @Data
    public class Message {
        private String username;
        private String content;
    
        public Message(String usename,String content){
            this.username = usename;
            this.content = content;
        }
    }

    测试:

    public class Test {
        public static void main(String[] args) {
            BoringApp socalApp = new BoringApp();
          //添加观察者 socalApp.addObserver(
    new User("老王")); socalApp.addObserver(new User("老李")); socalApp.pushMessage(new Message("小姐姐","明天去打篮球")); } }

    输出结果:

    【无聊app】推送了一条消息:发送人:小姐姐,消息内容明天去打篮球 
     ——————
    【无聊app】, 你收到了来自小姐姐的一条信息:明天去打篮球
    -----
    【无聊app】, 你收到了来自小姐姐的一条信息:明天去打篮球
    -----

    4、优缺点

    优点:
    1、观察者和被观察者是松耦合(抽象耦合)的,符合依赖倒置原则;
    2、 分离了表示层(观察者)和数据逻辑层(被观察者) ,并且建立了一套触发机制,使得数据的变
    化可以响应到多个表示层上;
    3、实现了一对多的通讯机制,支持事件注册机制, 支持兴趣分发机制,当被观察者触发事件时,只
    有感兴趣的观察者可以接收到通知。
    缺点:
    1、如果观察者数量过多,则事件通知会耗时较长;
    2、事件通知呈线性关系,如果其中一个观察者处理事件卡壳,会影响后续的观察者接收该事件;
    3、如果观察者和被观察者之间存在循环依赖,则可能造成两者之间的循环调用,导致系统崩溃。

  • 相关阅读:
    5.19 省选模拟赛 T1 小B的棋盘 双指针 性质
    5.15 省选模拟赛 容斥 生成函数 dp
    5.15 省选模拟赛 T1 点分治 FFT
    5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制
    luogu P4929 【模板】舞蹈链 DLX
    CF 878E Numbers on the blackboard 并查集 离线 贪心
    5.10 省选模拟赛 拍卖 博弈 dp
    5.12 省选模拟赛 T2 贪心 dp 搜索 差分
    5.10 省选模拟赛 tree 树形dp 逆元
    luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树
  • 原文地址:https://www.cnblogs.com/tdyang/p/13357304.html
Copyright © 2011-2022 走看看