21-Java观察者模式 ( Observer Pattern )

Java备忘录模式

    • 摘要
    • 实现
    • 范例

  • 观察者模式 ( Observer Pattern ) 常用于对象间存在一对多关系时,比如,当一个对象被修改时,需要自动通知它的依赖对象

  • 观察者模式属于行为型模式

摘要

1. 意图

  • 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

2. 主要解决

  • 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作

3. 何时使用

  • 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知

4. 如何解决

  • 使用面向对象技术,可以将这种依赖关系弱化

5. 关键代码

  • 在抽象类里有一个 ArrayList 存放观察者们

6. 应用实例

  • 拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价;
  • 西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作;

7. 优点

  • 观察者和被观察者是抽象耦合的;
  • 建立一套触发机制;

8. 缺点

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间;
  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃;
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化;

9. 使用场景

  • 有多个子类共有的方法,且逻辑相同;
  • 重要的、复杂的方法,可以考虑作为模板方法;

10. 注意事项

  • JAVA中已经有了对观察者模式的支持类;
  • 避免循环引用;
  • 如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式;

实现

在这里插入图片描述

观察者模式使用三个类 Subject、Observer 和 Client :Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法

  1. 定义Subject类、Observer抽象类和扩展了抽象类Observer的实体类;
  2. 定义ObserverPatternDemo类使用Subject和实体类对象来演示观察者模式;

范例

1. 创建 Subject 类

Subject.java

package com.demo.gof;
import java.util.ArrayList;
import java.util.List;public class Subject {private List<Observer> observers = new ArrayList<Observer>();private int state;public int getState() {return state;}public void setState(int state) {this.state = state;notifyAllObservers();}public void attach(Observer observer){observers.add(observer);      }public void notifyAllObservers(){for (Observer observer : observers) {observer.update();}}    
}

2. 创建 Observer 类

Observer.java

package com.demo.gof;
public abstract class Observer {protected Subject subject;public abstract void update();
}

3. 创建实体观察者类 BinaryObserver

BinaryObserver.java

package com.demo.gof;
public class BinaryObserver extends Observer{public BinaryObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Binary String: " + Integer.toBinaryString( subject.getState() ) ); }
}

OctalObserver.java

package com.demo.gof;
public class OctalObserver extends Observer{public OctalObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Octal String: " + Integer.toOctalString( subject.getState() ) ); }
}

HexaObserver.java

package com.demo.gof;
public class HexaObserver extends Observer{public HexaObserver(Subject subject){this.subject = subject;this.subject.attach(this);}@Overridepublic void update() {System.out.println( "Hex String: " + Integer.toHexString( subject.getState() ).toUpperCase() ); }
}

4. 使用 Subject 和实体观察者对象

ObserverPatternDemo.java

package com.demo.gof;
public class ObserverPatternDemo {public static void main(String[] args) {Subject subject = new Subject();new HexaObserver(subject);new OctalObserver(subject);new BinaryObserver(subject);System.out.println("First state change: 15"); subject.setState(15);System.out.println("Second state change: 10");    subject.setState(10);}
}

编译运行以上 Java 范例,输出结果如下

$ javac -d . src/main/com.demo/gof/ObserverPatternDemo.java
$ java  com.demo.gof.ObserverPatternDemo
First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/525601.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IPsec VPN配置方式

一、手工方式建立 手工方式建立IPsec的场景&#xff0c;全部参数需要手工配置&#xff0c;工作量大&#xff0c;适用于小型静态网络。 当企业总部与分支通过FW1和FW2之间建立的IPsec隧道进行安全通信。 手工配置步骤主要有四个&#xff1a; ①定义需要保护的数据流&#xff1…

蓝桥杯倒计时 36天-DFS练习

文章目录 飞机降落仙境诅咒小怂爱水洼串变换 飞机降落 思路&#xff1a;贪心暴搜。 #include<bits/stdc.h>using namespace std; const int N 10; int t,n; //这题 N 比较小&#xff0c;可以用暴力搜搜复杂度是 TN*N! struct plane{int t,d,l; }p[N]; bool vis[N];//用…

STL空间配置器

参考《STL源码剖析-侯捷》一书 (SGI版本STL) 前置 六大组件 空间配置器实现 SGI版本的空间配置器有两个&#xff0c;一个名为allocator&#xff0c;一个名为alloc。前者符合部分标准&#xff0c;但效率不好&#xff0c;只是对operator new和operator delete进行了封装&#…

电动机工作原理图

电机&#xff08;俗称“马达”&#xff09;是指依据电磁感应定律实现电能转换或传递的一种电磁装置。它的主要作用是产生驱动转矩&#xff0c;作为用电器或各种机械的动力源。 电动机&#xff0c;转子置于旋转磁场中&#xff0c;在旋转磁场的作用下&#xff0c;获得一个转动力…

Spring学习 基础(三)MVC

5、Spring MVC 传统Web模式&#xff1a; Model:系统涉及的数据&#xff0c;也就是 dao 和 bean。View&#xff1a;展示模型中的数据&#xff0c;只是用来展示。Controller&#xff1a;处理用户请求都发送给 &#xff0c;返回数据给 JSP 并展示给用户。 随着 Spring 轻量级开发…

anaconda问题合集

目录 一. 万分注意 二. ImportError: DLL load failed while importing _ctypes: 找不到指定的模块。 1. 发生情况 2. 导致结果和解决方法 三. WARNING: A newer version of conda exists. 1. 在conda install 某库的时候 2. 解决方法 一. 万分注意 不要轻易使用 conda …

创作之树常青——我的创作纪念日

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

深入浅出计算机网络 day.1 概论④ 计算机网络的定义和分类

不要退却&#xff0c;要绽放魅力 我的心会共鸣 和你 —— 24.3.9 一、计算机网络的定义 计算机网络早期的一个最简单定义 现阶段计算机网络的一个较好的定义 二、计算机网络的分类 按交换方式分类 按使用者分类 按传输介质分类 按覆盖范围分类 按拓扑结构分类&#xff0c;可…

美食网页成品 HTML美食网页设计制作 前端美食网页开发 热门美食特产网页制作中国传统特色小吃-臭豆腐 6页面 美食主题 HTML5 带设计说明

美食网页成品 HTML美食网页设计制作 前端美食网页开发 热门美食特产网页制作 中国传统特色小吃-臭豆腐 6页面 美食主题 HTML5 带设计说明 http://www.yuanle.net.cn/anli/30/4138.html

Research Agent:具有解决基于大型文本语料库的复杂问题,具备深度多跳推理的能力

原文地址&#xff1a;https://towardsdatascience.com/the-research-agent-4ef8e6f1b741 2023 年 8 月 29 日 问题简介 在2021年&#xff0c;开始应对基于大量文本回答问题的挑战。在预训练transformers之前的时代&#xff0c;这个问题很难破解。 人工智能和大型预训练tran…

图像处理ASIC设计方法 笔记8 卷积计算芯片的结构

(一) P81 卷积芯片内部模板框图 该设计有两个数据通路:图像数据和模板数据。 图像数据是经过帧控制、实时图SPRAM(写控制、 SPRAM读控制、数据读控制)、计算单元; 模板数据是经过模板SPRAM、计算单元。 4.5.4运算单元像素寄存器控制 存储SPRAM写入的64bit数据,输出为…

这些AI智能写作软件都能满足你的写作需求

当前&#xff0c;AI写作软件在写作领域中呈现出蓬勃发展的趋势&#xff0c;这为有写作需求的人们带来了极大的便利&#xff0c;同时也让写作者们能够更高效、更便捷地进行创作。那么问题来了&#xff0c;有哪些ai写作软件比较好用呢&#xff1f;小编为您揭晓答案~ 爱制作AI写作…