• 15设计模式-行为型模式-观察者模式


    概述

    观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。对象行为型模式
    在这里插入图片描述
    讲人话:观察者去观察目标,当目标发生变化时就会去通知观察者。类比:就好比抖音有一个漂亮小姐姐这么一个主播,那么就会有很多帅哥关注她,有一天漂亮小姐姐要开播跳舞了,她就会去通知所有的帅哥来看她的热舞

    coding

    1、定义一个观察者的抽象类(如上例子,就是抖音中的各种粉丝),其中最重要的就是接受目标的信息

    package com.xusj.future.behavioral.observer;
    
    /**
     * 观察者-抽象类,抖音粉丝
     *
     * @author xusj
     * 
    CreateDate 2022/8/9 22:39 */
    public abstract class AbsFans { // 获取观察对象的消息 abstract String getMsg(String msg); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2、子类-真的粉丝

    package com.xusj.future.behavioral.observer;
    
    /**
     * @author xusj
     * 
    CreateDate 2022/8/9 22:44 */
    public class SomeOneFans extends AbsFans { @Override String getMsg(String msg) { // 观察者【抖音粉丝】-观察到小姐姐【被观察者的消息】的 System.out.println("我收到了,女神说" + msg); return msg; } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    3、被观察者的抽象类

    package com.xusj.future.behavioral.observer;
    
    /**
     * 发布者-抽象,抖音用户
     *
     * @author xusj
     * 
    CreateDate 2022/8/9 22:33 */
    public abstract class AbsTikTok { // (添加)组合观察者 abstract void addFans(AbsFans fans); // 通知粉丝 abstract void notifyFans(String msg); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4、具体被观察者在观察者模式中最重要的一点就是,在被观察者中组合观察者

    package com.xusj.future.behavioral.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 具体被观察类:跳舞小姐姐的抖音账号
     *
     * @author xusj
     * 
    CreateDate 2022/8/9 22:42 */
    public class GoodGirlTikTok extends AbsTikTok { // 观察者的核心,就是在被观察者中组合观察者 List<AbsFans> list = new ArrayList<>(); @Override void addFans(AbsFans fans) { list.add(fans); } @Override void notifyFans(String msg) { // 对所有的粉丝进行通知(我漂亮小姐姐,上线了,要开跳舞直播了) for (AbsFans absFans : list) { absFans.getMsg(msg); } } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    5、测试类

    package com.xusj.future.behavioral.observer;
    
    /**
     * @author xusj
     * 
    CreateDate 2022/8/9 22:48 */
    public class Test { public static void main(String[] args) { // 美女主播来一个 AbsTikTok goodGirlTikTok = new GoodGirlTikTok(); SomeOneFans fans01 = new SomeOneFans(); SomeOneFans fans02 = new SomeOneFans(); goodGirlTikTok.addFans(fans01); goodGirlTikTok.addFans(fans02); // 开始通知,观察者 goodGirlTikTok.notifyFans("我漂亮小姐姐,上线了,要开跳舞直播了"); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    使用场景

    什么场景用到?
    Spring事件机制如何实现?
    Vue的双向绑定核心
    响应式编程核心思想

    三个条件:观察者 被观察,话题订阅按上述说的关系,实际应用最广泛显然可见就是 公众号推送消息,独立的微信号关注多个公众号 ,每次总能收到公众号发部的更新内容订阅号也会将公众号置顶标红提醒.这就是典型的观察者模式.一个或者多个公众号视为被观察者,用户微信则为订阅话题与被观察者建立一对多关系.自然用户就是属于观察者了

    其实mq就是一个观察者模式的思想

  • 相关阅读:
    Vue
    在 Excel 中使用 Python 自动填充公式
    C++核心编程——P36-友元
    Java反射、枚举、Lambda表达式
    MySQL MHA高可用配置及故障切换
    Ubuntu搭建FTP服务
    Educational Codeforces Round 135 (Rated for Div. 2)
    基于GA遗传优化的PID控制器控制参数整定matlab仿真
    NextJs 数据篇 - 数据获取 | 缓存 | Server Actions
    Spring和SpringBoot简介
  • 原文地址:https://blog.csdn.net/weixin_46643875/article/details/126257389