OBSERVER(观察者)-- 对象行为模式

ops/2024/10/18 18:28:44/
  1. 意图:
    定义对象间地一种一对多地依赖关系,当一个对象地状态发生改变时,所有对于依赖于它的对象都得到通知并被自动更新。

  2. 别名:
    依赖(Dependents), 发布-订阅(Publish-Subsribe)

  3. 动机:
    将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维护一致性而是各类紧密耦合,这样降低了它们的可重用性。

  4. 适用性:
    在以下任一情况下可以使用观察者模式:
    a. 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
    b. 当一个对象必须通知其它对象,而它有不能假定其他对象是谁。换言之,你不希望这些对象是紧密耦合的。

  5. 结构:
    观察者模式结构图

  6. 参与者:
    a. Subject:
    目标知道它的观察者。可以有多个观察者观察同一个目标。
    提供注册和删除观察者对象的接口。
    b. Observer:
    为那些在目标发生改变时需获得通知的对象定义一个跟新接口。
    c. ConcreteSubject:
    将有关状态 存入各ConcreteObserver
    当它的状态发生改变时,向它的各个观察者发生通知。
    d. ConcreteObserver:
    维护一个指向ConcreteSubject对象的引用。
    存储有关状态,这些状态应与目标的状态保持一致。
    实现Observer的更新接口以使自身状态与目标的状态保持一致。

  7. 协作:
    观察者模式协作图

  8. 效果:
    a. 目标和观察者间的抽象耦合
    b. 支持广播通信
    c. 意外的更新

  9. 实现:
    a. 创建目标到其观察者之间的映射
    b. 观察多个目标
    c. 谁触发更新
    d. 对已删除目标悬挂引用
    e. 在发出通知前确保目标的状态自身是一致的
    f. 避免特定于观察者的更新协议–推/拉模式
    g. 显式地指定感兴趣的改变
    h. 封装复杂的更新语义
    i. 结合目标类和观察者

  10. 代码示例:

    public interface Observer {void update();}public interface Subject {void attach(Observer observer);void detach(Observer observer);void notify2();}public class ConcreteSubject implements Subject {private int state;private List<Observer> observers = new ArrayList<>();@Overridepublic void attach(Observer observer) {observers.add(observer);}@Overridepublic void detach(Observer observer) {observers.remove(observer);}@Overridepublic void notify2() {for (Observer observer : observers) {observer.update();}}public int getState() {return state;}public void setState(int state) {this.state = state;notify2();}}public class ConcreteObserver implements Observer{private int observerState;private ConcreteSubject subject;public ConcreteObserver(ConcreteSubject subject) {this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {observerState = subject.getState();System.out.println("Observer state update: " + observerState);}}public class Client {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();ConcreteObserver observer1 = new ConcreteObserver(subject);ConcreteObserver observer2 = new ConcreteObserver(subject);subject.setState(10);subject.setState(20);subject.detach(observer1);subject.detach(observer2);}}
  1. 已知应用:

  2. 相关模式:
    Mediator:通过封装复杂的更新语义,ChangeManager充当目标和观察者之间的中介者。
    Singleton: ChangeManager可使用Singleton模式来保证它是唯一的并且是可全局访问的。


http://www.ppmy.cn/ops/28134.html

相关文章

【JavaEE】线程的概念

文章目录 1、什么是线程2、进程和线程的区别3、多线程的概述4、在Java中实现多线程的方法1.继承Thread类2.实现Runnable接口3.使用匿名内部类来继承Thread类&#xff0c;实现run方法4.使用匿名内部类来实现Runnable接口&#xff0c;实现run方法5.使用 lambda表达式 1、什么是线…

【大数据】利用 Apache Ranger 管理 Amazon EMR 中的数据权限

利用 Apache Ranger 管理 Amazon EMR 中的数据权限 1.需求背景简介2.系统方案架构图3.主要服务和组件简介3.1 Amazon EMR3.2 Simple Active Directory3.3 Apache Ranger 4.部署步骤4.1 部署 Simple AD 服务4.2 部署 Apache Ranger4.3 部署 Amazon EMR4.4 在 Amazon EMR 的主节点…

fedora 40默认grub配置文件路径

如果需要添加自定义的菜单项或者其他高级配置&#xff0c;可以编辑&#xff1a; /etc/default/grub 文件&#xff0c;然后以下命令来更新grub.cfg: grub2-mkconfig -o /boot/grub2/grub.cfg /etc/default/grub常见选项的解释&#xff1a; GRUB_TIMEOUT&#xff1a; 默认值&…

Cocos Creator 3D物理引擎的物理参数控制详解

前言 Cocos Creator是一款基于JavaScript和TypeScript的开源游戏引擎&#xff0c;它提供了强大的3D物理引擎&#xff0c;可以帮助开发者实现各种物理效果。在Cocos Creator中&#xff0c;我们可以通过控制物理参数来实现不同的物理效果&#xff0c;比如重力、碰撞检测、摩擦力…

fdfs安装启动及性能优化

fsatDFS安装 1、使用 wget 命令下载压缩包&#xff0c;如果没有 wget 命令使用 yum 命令安装 yum install wget 2、下载 fastdfs wget -c “https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz” 3、下载 libfastcommon wget -c “https://github.com/happyfish10…

【记录】Springboot项目集成docker实现一键部署

公司管理平台完成后&#xff0c;为了方便其他不懂开发的同事部署和测试&#xff0c;集成docker进行一键部署&#xff0c;也为后面自动化部署做准备。本文做个简单记录。 1、安装docker yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/cont…

Jenkins邮件发送失败问题解决

如下提示为 Extended E-mail Notification开启Debug模式下显示的错误信息&#xff0c; (Debug模式设置方法&#xff1a;Dashboard-> manage Jenkins->configure System)DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 DEB…

【Redis 开发】Redisson

Redisson RedissonRedisson分布式锁Redisson可重入锁Redission解决超时释放的问题Redission解决锁的判断一次性问题Redission分布式锁主从一致性问题 Redisson Redisson是一个在Redis的基础上实现的java驻内存数据网格&#xff0c;就是提供了一系列的分布式的java对象 官方地址…