观察者模式Observer

news2024/11/25 2:23:24

1.意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
2.结构
在这里插入图片描述
Subject(目标)知道它的观察者,可以有任意多个观察者观察同一个目标;提供注册和删除观察者对象的接口。
Observer(观察者)为那些在目标发生改变时需获得通知的对象定义一个更新接口。
ConcreteSubject(具体目标)将有关状态存入各ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知。
ConcreteObserver(具体观察者)维护一个指向ConcreteSubject对象的引用;存储有关状态,这些状态应与目标的状态保持一致;实现Observer的更新接口,以使自身状态与目标的状态保持一致。
3.适用性:
当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时。
当一个对象必须通知其他对象,而它又態假定其他对象是谁,即不希望这些对象是紧耦合的。
4.常见案例:博客(微博)关注,发消息通知粉丝
代码案例
某文件管理系统中定义了类OfficeDoe和DocExplorer。当类OfficeDoe发生变化时,类DocExplorer的所有对象都要更新其自身的状态。现采用观察者(Observer)设计模式来实现该需求。
稍微改了下输出语句,使得好理解
软件设计师考试2019年下半年下午题第6题

import java.util.ArrayList;
import java.util.List;

/**
 * 观察者模式
 */
class ObserverTest{
    public static void main(String[] args) {
        Subject subject = new OfficeDoc("王一博");
        Observer observerA = new DocExplorer("粉丝一",subject);
        Observer observerB = new DocExplorer("粉丝二",subject);
        subject.Notify();
    }
}

interface Subject{
    void Attach(Observer observer);
    void Detach(Observer observer);
    void Notify();
    void setStatus(int status);
    int getStatus();
}
//目标
class OfficeDoc implements Subject{
    private List<Observer> myObs;
    private String mySubjectName;
    private int m_status;
    public OfficeDoc(String name){
        mySubjectName = name;
        this.myObs = new ArrayList<>();
        m_status = 0;
    }

    @Override
    public void Attach(Observer observer) {
        this.myObs.add(observer);
    }

    @Override
    public void Detach(Observer observer) {
        this.myObs.remove(observer);
    }

    @Override
    public void Notify() {
        for(Observer obs : myObs){
            obs.update(mySubjectName);
        }
    }

    @Override
    public void setStatus(int status) {
        m_status = status;
        System.out.println("setStatus subject["+mySubjectName+"]status:["+status+"]");
    }

    @Override
    public int getStatus() {
        return m_status;
    }
}

public interface Observer {
    void update(String mySubjectName);
}
//观察者
class DocExplorer implements Observer{
    private String myObsName;
    public DocExplorer(String name, Subject sub){
        myObsName = name;
        sub.Attach(this);
    }

    @Override
    public void update(String mySubjectName) {
        System.out.println(mySubjectName+"发布微博通知了["+myObsName+"]");
    }
}

运行结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter GetX系列教程---GetxController

安装 将 GetX 添加到你的 pubspec.yaml 文件中 dependencies:get: ^4.6.5在需要用到的文件中导入&#xff0c;它将被使用。 import package:get/get.dart;GetxController介绍 在实际的项目开发过程中&#xff0c;我们不可能把UI代码、业务逻辑都放在一起处理&#xff0c;这…

Google 二次签名 导致 Facebook , Google 登录失败

前言&#xff1a; 最近接了几款游戏 里面携带了facebook 授权登录和google 授权问题 问题场景 在没有上线之前 我们运营和测试 验收都没有问题 但是把游戏包发到商店后再重商店下载出来就不能授权登录。 原因 因为App上传到Google Play后&#xff0c;Google Play 有个签名…

使用idea无法推送到gitee,显示head detached(游离分支)

在idea下将代码回退到某一历史版本&#xff0c;修改后push提醒detaced head&#xff0c;即处于游离状态&#xff0c;使用 git branch命令&#xff08;辅助git status查看提交状态&#xff09;查看&#xff1a; 解决方法 在git bash下***&#xff08;注意&#xff09;切换到项…

django使用一——规范化创建

背景 为便于后续维护&#xff0c;前期对django创建等操作做一些规范化要求 实操 1、【项目创建】先创建一个项目&#xff0c;其中SSS可以项目架构相关&#xff0c;XXX则是项目名称 常用命令&#xff1a; django startproject SSS_app_XXX如果提示报错django命令不存在&…

超全地牢场景unity3d模型素材网站整理

家人们&#xff0c;最近我找到了一个很好用的地牢场景unity3d模型免费素材网站 资源贼多&#xff0c;重点是免费&#xff01;&#xff01;&#xff01;嘿嘿嘿&#xff01;&#xff01;&#xff01;感兴趣的可以进去看看 接下来就给大家介绍一下我珍藏已久的网站&#xff1a; …

string类的基本使用及模拟实现(深浅拷贝)

目录 浅拷贝与深拷贝 string的基本使用和模拟实现 浅拷贝与深拷贝 namespace lyl { class string { public: string(const char* str) :_str(new char[strlen(str)1]) { strcpy(_str, str); } ~string() …

TPM零知识学习九 —— TPM规范学习之TPM介绍

前边的系列文章主要从实际平台移植和TPM环境搭建的角度讲解了TPM&#xff0c;现在到了踏实下来学习理论知识的时候了。从本篇文章开始&#xff0c;开启TPM2.0规范学习之旅。参考书目为&#xff1a;《A Practical Guide to TPM 2.0 — Using the Trusted Plaform Module in the …

利器 | REST Assured 实践(二):断言实现

在上一篇文章中&#xff0c;我们初步探讨了 REST Assured 的应用实践&#xff0c;还有很多丰富的用法需要慢慢探索研究。而 REST Assured 提供的完整断言手段&#xff0c;是测试工程师最常用最重要的功能之一。断言该如何使用呢&#xff1f; 这里以 rest-assured 官方给的一个…

好用的元数据管理工具是什么样

元数据是数据的“说明书”&#xff0c;元数据管理工具是企业数据治理的重要抓手&#xff0c;它可以帮助企业解决数据查找难、理解难等问题&#xff0c;促进数据的集成和共享。一个趁手的元数据管理工具是什么样的呢&#xff1f; 01 系统架构 从应用角度看&#xff0c;元数据管…

基于颜色直方图优化的图像增强方法

最近改图像颜色迁移的论文&#xff0c;审稿人要求补充基于直方图优化的方法细节。趁此机会&#xff0c;我重新下载了相关文献&#xff0c;决定重新学习下该类方法&#xff0c;并把一些细节记录在本篇博客中&#xff0c;供交流学习。 目录 1. 前言 2. 背景知识 3. 颜色变换 4. 颜…

若依源码分析(二)-登录流程源码分析

若依源码分析&#xff08;二&#xff09;-登录流程源码分析 本章节主要分析若依源码登录流程&#xff0c;一步一步走断点查看进入首页的全流程登录信息 1. 前台发起登录请求 http://127.0.0.1/dev-api/auth/login //auth表明这个请求走的是服务名称为auth的服务2. 后台处理流…

【虚幻引擎】UE4像素流推送PixelStreaming

一、前言 虚幻引擎像素流送&#xff08;Pixel Streaming&#xff09;允许你从任何有屏幕的联网设备&#xff08;例如计算机&#xff0c;手机&#xff0c;平板电脑等&#xff09;播放虚幻项目。在这个教程里&#xff0c;我们将学习如何激活虚幻引擎的像素流送并从任何Web浏览器控…

年尾结款,如何应对客户新的需求风险?

1、进行需求变更管理流程 需要提前建立需求基线&#xff0c;需求基线是需求变更的依据&#xff0c;并制定双方皆认可的需求变更流程。 在前期与用户签订合同时&#xff0c;可以增加一些相关条款&#xff0c;如限定用户提出需求变更的时间&#xff0c;规定何种情况的变更可以接受…

日期和时间的API

一、JDK8之前的日期和时间的API 1.System类中的currentTimeMillis() 返回当前时间与1970年1月1日0分0秒之间以毫秒为单位的时间差&#xff0c;称为时间戳 2.Java.util.Date类 |---java.sql.Date类 1.两个构造器的使用 >构造器一: Date(): 创建一个对应当前时间的Date对象…

CVE-2022-08475-DirtyPipe

前言CVE-2022-0847 DirtyPipe脏管道漏洞是Linux内核中的一个漏洞&#xff0c;该漏洞允许写只读文件&#xff0c;从而导致提权。调试环境• ubuntu 20.04• Linux-5.16.10• qemu-system-x86_64 4.2.1漏洞验证首先创建一个只读文件foo.txt&#xff0c;并且正常情况下是无法修改该…

2022年「博客之星」参赛博主:黛琳ghz

我正在参加年度博客之星评选&#xff0c;请大家帮我投票打分&#xff0c;您的每一分都是对我的支持与鼓励。五星必回&#xff0c;诚信互评&#xff0c;&#xff08;如果&#xff09;今日已满&#xff0c;明天必回&#xff0c;言出必行&#xff0c;感谢支持&#xff01; 我正在…

Protobuf:python版使用

目录 Protobuf详解 Python使用方式 下载protoc 编写.proto协议文件 编译Protocol buffer 存储/读取数据测试 Protobuf详解 深入 ProtoBuf - 简介 - 简书 (jianshu.com)[索引]文章索引 - 简书 (jianshu.com) Protobuf3语法详解 - 望星辰大海 - 博客园 (cnblogs.com) Pyth…

联芸科技冲刺科创板上市:业绩表现不稳定,实控人方小玲为美国籍

12月28日&#xff0c;联芸科技&#xff08;杭州&#xff09;股份有限公司&#xff08;下称“联芸科技”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。 本次冲刺上市&#xff0c;联芸科技计划募资20.50亿元&#xff0c;其中4.66亿元用于新一代数据存储…

prophet模块学习总结-20221228

prophet模块的基本介绍及相关用法说明。 文章目录1.基本介绍Prophet包的特点2.Prophet 模型介绍2.1 长期趋势模型2.2 The Seasonality Function&#xff08;季节函数&#xff09;2.3 The Holiday/Event Function&#xff08;节日函数&#xff09;3.使用示例3.1 快速开始3.2 调节…

MetersPhere自动化解决用户登录问题+添加钉钉机器人

MetersPhere自动化解决用户登录问题添加钉钉机器人 现在遇到的问题&#xff0c;做自动化的时候几乎每个接口都需要token&#xff0c;这个token是登录获取的&#xff0c;那我有很多个自动化的场景&#xff0c;如果我每一个场景都加入登录接口&#xff0c;同时执行很多场景的时候…