FSA全栈行动 FSA全栈行动
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr

公众号:FSA全栈行动

记录学习过程中的知识
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr
  • DesignPattern - 设计原则与设计模式初探
  • DesignPattern - 单例模式【创建型】
  • DesignPattern - 工厂模式【创建型】
  • DesignPattern - 原型模式【创建型】
  • DesignPattern - 建造者模式【创建型】
  • DesignPattern - 适配器模式【结构型】
  • DesignPattern - 桥接模式【结构型】
  • DesignPattern - 组合模式【结构型】
  • DesignPattern - 装饰器模式【结构型】
  • DesignPattern - 代理模式【结构型】
  • DesignPattern - 外观模式【结构型】
  • DesignPattern - 享元模式【结构型】
  • DesignPattern - 策略模式【行为型】
  • DesignPattern - 模板方法模式【行为型】
  • DesignPattern - 观察者模式【行为型】
    • 一、观察者模式介绍
    • 二、观察者模式代码实现
  • DesignPattern - 责任链模式【行为型】
  • DesignPattern - 命令模式【行为型】
  • DesignPattern - 迭代器模式【行为型】
  • DesignPattern - 备忘录模式【行为型】
  • DesignPattern - 状态模式【行为型】
  • 《深入浅出设计模式Java版》
FullStackAction
2021-09-15
目录

DesignPattern - 观察者模式【行为型】

欢迎关注微信公众号:[FSA全栈行动 👋]

# 一、观察者模式介绍

观察者模式(Observer)定义了对象间一种一对多的依赖关系,使得每当一个对象改变状态时,所以依赖于它的对象都会得到通知并自动更新,也叫做发布订阅模式 Publish/Subscribe,属于行为型模式

  • 核心组成

    • Subject 主题:持有多个观察者对象的引用,抽象主题提供了一个接口可以增加和删除观察者对象;有一个观察者数组,并实现增、删及通知操作
    • Observer 抽象观察者:为具体观察者定义一个接口,在得到主题的通知时更新自己
    • ConcreteSubject 具体主题:将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知
    • ConcreteObserver 具体观察者:实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态保持一致
  • 应用场景

    • 消息通知,比如邮件通知、广播通知、微信朋友圈、微博私信等,都是监听观察事件
    • 当一个对象的改变需要同时改变其它对象,且它不知道具体有多少对象有待改变的时候,考虑使用观察者模式
  • 优点

    • 降低了目标与观察者之间的耦合关系,目标与观察者之间建立了一套触发机制
    • 观察者和被观察者是抽象的
  • 缺点

    • 观察者和观察目标之间有循环依赖的话,会触发它们之间进行循环调用,可能导致系统崩溃
    • 一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间

# 二、观察者模式代码实现

创建抽象主题类:

/**
 * 抽象主题
 *
 * @author GitLqr
 */
public class Subject {
	private List<Observer> observerList = new ArrayList<>();

	public void add(Observer observer) {
		observerList.add(observer);
	}

	public void remove(Observer observer) {
		observerList.remove(observer);
	}

	public void notifyAllObservers() {
		for (Observer observer : observerList) {
			observer.update();
		}
	}
}

创建抽象观察者类:

/**
 * 观察者
 *
 * @author GitLqr
 */
public abstract class Observer {
	public abstract void update();
}

创建具体主题类:

/**
 * 具体主题:QQ新闻推送
 *
 * @author GitLqr
 */
public class QQNewsSubject extends Subject {

	public void pushNews() {
		notifyAllObservers();
	}
}

创建具体观察者类:

/**
 * 具体观察者:QQ
 *
 * @author GitLqr
 *
 */
public class QQObserver extends Observer {

	@Override
	public void update() {
		System.out.println("QQ 收到了新闻推送");
	}
}

/**
 * 具体观察者:Tim
 *
 * @author GitLqr
 *
 */
public class TimObserver extends Observer {

	@Override
	public void update() {
		System.out.println("Tim 收到了新闻推送");
	}
}

使用:

public static void main(String[] args) {
    // 创建一个主题:QQ新闻
    QQNewsSubject subject = new QQNewsSubject();

    // 创建多个QQ号
    Observer qq1Observer = new QQObserver();
    Observer qq2Observer = new TimObserver();

    // 订阅主题
    subject.add(qq1Observer);
    subject.add(qq2Observer);

    // 推送QQ新闻
    subject.pushNews();
}
#设计模式#观察者模式
DesignPattern - 模板方法模式【行为型】
DesignPattern - 责任链模式【行为型】

← DesignPattern - 模板方法模式【行为型】 DesignPattern - 责任链模式【行为型】→

最近更新
01
Flutter - Xcode16 还原编译速度
04-05
02
AI - 免费的 Cursor 平替方案
03-30
03
Android - 2025年安卓真的闭源了吗
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2025 FSA全栈行动
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×