Chiriri's blog Chiriri's blog
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)

Iekr

苦逼后端开发
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)
  • JavaSE

  • JavaEE

  • Linux

  • MySQL

  • NoSQL

  • Python

  • Python模块

  • 机器学习

  • 设计模式

    • 设计模式的概念
    • 创建型模式
    • 单例(Singleton)模式
    • 原型(Prototype)模式
    • 工厂(Factory)模式
    • 建造者(Builder)模式
    • 结构型模式(Structural Pattern)
    • 适配器模式(Adapter Pattern)
    • 桥接模式(Bridge Pattern)
    • 装饰器模式(Decorator、Wrapper(包装) Pattern)
    • 代理模式(Proxy Pattern)
    • 外观模式(Facade Pattern)
    • 组合模式(Composite Pattern)
    • 享元模式(Flyweight Pattern)
    • 行为型模式(Behavioral Patterns)
    • 模板方法(Template Method)
    • 策略(Strategy)模式
    • 状态(State)模式
    • 中介者(Mediator)模式
    • 观察者(Observer)模式
      • 应用场景
      • 观察者模式的好处
    • 备忘录(Memento)模式
    • 解释器(Interpreter)模式
    • 命令(Command)模式
    • 迭代器(Iterator)模式
    • 访问者(Visitor)模式
    • 职责链(Chain of Responsibility)模式
    • 总结
  • 传智健康

  • 畅购商城

  • 博客项目

  • JVM

  • JUC

  • Golang

  • Kubernetes

  • 硅谷课堂

  • C

  • 源码

  • 神领物流

  • RocketMQ

  • 短链平台

  • 后端
  • 设计模式
Iekr
2023-12-09
目录

观察者(Observer)模式

# 观察者(Observer)模式

观察者模式 (Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布 - 订阅(Publish/Subscribe)模式、模型 - 视图(Model/View)模式、源 - 监听器(Source/Listener)模式或从属者(Dependents)模式。对象行为型模式

image-20231209220032623

Subject: 目标

public abstract class AbstractTikToker {
    // 添加粉丝
    abstract void addFans(AbstractFans fans);

    // 通知粉丝
    abstract void notifyFans(String msg);
}
1
2
3
4
5
6
7

ConcreteSubject: 具体目标

public class MMTikToker extends AbstractTikToker {
    // 观察者的核心1
    List<AbstractFans> fansList = new ArrayList<>();


    @Override
    void addFans(AbstractFans fans) {
        System.out.println("粉丝+1");
        fansList.add(fans);
    }

    @Override
    void notifyFans(String msg) {
        // 观察者核心2
        for (AbstractFans fans : fansList) {
            fans.acceptMsg(msg);
        }
    }

    void startSell() {
        System.out.println("主播开始卖货");
        notifyFans("主播开始卖货了");
    }

    void endSell() {
        System.out.println("主播结束卖货");
        notifyFans("主播结束卖货了");
    }
}
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

Observer: 观察者

/**
 * 抽象观察者
 */
public abstract class AbstractFans {
//    List<AbstractTikToker> tikTokers; // 双向观察
    abstract void acceptMsg(String msg);

    void follow(AbstractTikToker tikToker) {
        // 主播粉丝+1
        tikToker.addFans(this);
//        for (AbstractTikToker toker : tikTokers) {
//
//        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

ConcreteObserver: 具体观察者

public class RobotFans extends AbstractFans{
    @Override
    void acceptMsg(String msg) {
        System.out.println("刷流量刷流量");
    }
}
1
2
3
4
5
6
public class HumanFans extends AbstractFans {
    @Override
    void acceptMsg(String msg) {
        System.out.println("收到通知:" + msg);
        System.out.println("粉丝进入了直播间");
    }
}
1
2
3
4
5
6
7

测试

public class MainTest {
    public static void main(String[] args) {
        MMTikToker mmTikToker = new MMTikToker();
        mmTikToker.startSell();
        System.out.println("-----");
        // 关注主播
        RobotFans fans = new RobotFans();
        fans.follow(mmTikToker);
        HumanFans fans1 = new HumanFans();
        fans1.follow(mmTikToker);
        HumanFans fans2 = new HumanFans();
        fans2.follow(mmTikToker);
        mmTikToker.endSell();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 应用场景

什么场景用到?

  • Spring 事件机制如何实现?
  • Vue 的双向绑定核心
  • 响应式编程核心思想

Jdk 的 Observable 类就使用了观察者模式

image-20231209221900694

# 观察者模式的好处

  1. 观察者模式设计后,会以集合的方式来管理用户 (Observer),包括注册,移除和通知。
  2. 这样,我们增加观察者 (这里可以理解成一个新的公告板),就不需要去修改核心类 WeatherData 不会修改代码,遵守了 ocp 原则。
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02
中介者(Mediator)模式
备忘录(Memento)模式

← 中介者(Mediator)模式 备忘录(Memento)模式→

最近更新
01
k8s
06-06
02
进程与线程
03-04
03
计算机操作系统概述
02-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Iekr | Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式