【软件设计_设计模式】设计模式代码笔记

 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

最佳自学课程

目录

一、观察者模式

Java

TypeScript


一、观察者模式

Java

观察者(实现者)抽象类 

/*** Created by tianming.fan on 2024/12/13.*/
//观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。
public abstract class ObserverABC<T> {protected SubjectAPI subject;public abstract void update(T data);public ObserverABC(SubjectAPI subject) {this.subject = subject;}public SubjectAPI getSubject() {return subject;}
}

主题接口 


/*** Created by tianming.fan on 2024/12/13.*/
//主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。
public interface SubjectAPI {//注册void registerObserver(ObserverABC o);//注销void removeObserver(ObserverABC o);//通知void notifyAllObservers();
}

主题(命令) 实现类

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;/*** Created by tianming.fan on 2024/12/13.*/
//主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。
public class Subject implements SubjectAPI{private List<ObserverABC> observers = new LinkedList<ObserverABC>();private String data;public void setData(String data) {this.data = data;notifyAllObservers();}@Overridepublic void registerObserver(ObserverABC o) {observers.add(o);}@Overridepublic void removeObserver(ObserverABC o) {observers.remove(o);}public void notifyAllObservers(){// 获取LinkedList的迭代器Iterator<ObserverABC> iterator = observers.iterator();// 使用迭代器遍历LinkedListwhile (iterator.hasNext()) {// hasNext()方法检查是否还有下一个元素// next()方法返回序列中的下一个元素ObserverABC element = iterator.next();element.update(data);}}
}

观察者实现类 

/*** Created by tianming.fan on 2024/12/13.*/
//观察者(Observer):观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。
public class BinaryObserver extends ObserverABC<String> {public BinaryObserver(SubjectAPI subject){super(subject);getSubject().registerObserver(this);}@Overridepublic void update(String data) {System.out.println( "Binary String: " + Integer.toBinaryString(Integer.parseInt(data)) );}
}
public class HexaObserver extends ObserverABC<String> {public HexaObserver(SubjectAPI subject){super(subject);getSubject().registerObserver(this);}@Overridepublic void update(String data) {System.out.println( "Hex String: " + Integer.toHexString( Integer.parseInt(data) ).toUpperCase() );}
}
public class OctalObserver extends ObserverABC<String> {public OctalObserver(SubjectAPI subject){super(subject);getSubject().registerObserver(this);}@Overridepublic void update(String data) {System.out.println( "Octal String: " + Integer.toOctalString(Integer.parseInt(data)) );}
}

/*** 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。** 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。*//**结构观察者模式包含以下几个核心角色:主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。观察者(Observer):观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。具体主题(Concrete Subject):具体主题是主题的具体实现类。它维护着观察者列表,并在状态发生改变时通知观察者。具体观察者(Concrete Observer):具体观察者是观察者的具体实现类。它实现了更新方法,定义了在收到主题通知时需要执行的具体操作。*/
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.setData(String.valueOf(19));}
}

TypeScript

// 定义抽象观察者类
export abstract class AbstractObserver {public abstract update(): void;
}
import { AbstractObserver } from './AbstractObserver';
// 定义主题接口
export interface Subject {attach(observer: AbstractObserver): void;detach(observer: AbstractObserver): void;notify(): void;
}
import { AbstractObserver } from "./AbstractObserver";
import type { Subject } from "./Subject";// 实现主题
export class ConcreteSubject implements Subject {private observers: AbstractObserver[] = [];private state: number = 0;public getState(): number {return this.state;}public setState(state: number): void {this.state = state;this.notify();}public attach(observer: AbstractObserver): void {if (this.observers.indexOf(observer) === -1) {this.observers.push(observer);}}public detach(observer: AbstractObserver): void {const index = this.observers.indexOf(observer);if (index !== -1) {this.observers.splice(index, 1);}}public notify(): void {for (const observer of this.observers) {observer.update();}}
}
import { AbstractObserver } from './AbstractObserver';
import { ConcreteSubject } from './ConcreteSubject';
// 实现具体观察者
export class ConcreteObserver extends AbstractObserver {private subject: ConcreteSubject;constructor(subject: ConcreteSubject) {super();this.subject = subject;}public update(): void {console.log(`观察者收到通知:主题状态已更新为 ${this.subject.getState()}`);}
}

import { AbstractObserver } from './src/AbstractObserver';
import { ConcreteSubject } from './src/ConcreteSubject';
import { ConcreteObserver } from './src/ConcreteObserver';// 使用示例
const subject = new ConcreteSubject();
const observer1 = new ConcreteObserver(subject);
const observer2 = new ConcreteObserver(subject);subject.attach(observer1);
subject.attach(observer2);subject.setState(1); // 通知所有观察者
subject.detach(observer1); // 移除一个观察者subject.setState(2); // 再次通知所有观察者


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

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

相关文章

【Android学习】RxJava

文章目录 资料连接1. Merge & Zip操作符: 合并数据源2. Map & FlapMap & ConcatMap & Buffer: 变换操作符3. retry & retryUntil & retryWhen : 错误处理操作符4. Transformer & Compose 转换操作符5. 网络请求嵌套回调 FlatMap6. 网络请求出错重连…

Mac配置 Node镜像源的时候报错解决办法

在Mac电脑中配置国内镜像源的时候报错,提示权限问题,无法写入配置文件。本文提供解决方法,青测有效。 一、原因分析 遇到的错误是由于 .npm 目录下的文件被 root 用户所拥有,导致当前用户无法写入相关配置文件。 二、解决办法 在终端输入以下命令,输入管理员密码即可。 su…

PyTorch基础入门

目录 前言一、[张量的广播&基本运算](https://www.bilibili.com/video/BV1Gg411u7Lr/?spm_id_from333.999.0.0)1. 张量的广播特性2. 逐点&规约&比较运算 二、张量的线性代数运算1. BLAS & LAPACK2. 矩阵形变及特殊矩阵构造3. 矩阵基本运算4. 矩阵的线性代数运…

Java基础夯实——2.6 Java中锁

1 Java中锁的概念 锁用于控制多个线程对共享资源的访问。只有持有锁的线程才能访问被保护的资源&#xff0c;其他线程必须等待锁的释放。这种机制可以防止线程之间的竞争条件&#xff08;Race Condition&#xff09;。保证了同一时刻只有一个线程持有对象的锁并修改该对象&…

【VSCode】常用插件汇总

1 Path Autocomplete&#xff08;路径提示的插件&#xff09; 步骤一&#xff1a;在vscode的扩展搜索中直接搜索Path Autocomplete&#xff0c;直接安装 步骤二&#xff1a;配置 配置 VS Code settings.json "path-autocomplete.pathMappings": {"": &q…

IOS通过WDA自动化中遇到的问题

IOS自动化遇到的问题 搭建WDA环境中遇到的问题1、XCode unsupport iphone xxx.2、创建Bundle Identifier出现问题&#xff1a;Communication with Apple failed3、创建Bundle Identifier出现问题&#xff1a;Automatic signing failed \Signing certificate is invalid4、创建B…

Golang Gin Redis+Mysql 同步查询更新删除操作(我的小GO笔记)

我的需求是在处理几百上千万数据时避免缓存穿透以及缓存击穿情况出现&#xff0c;并且确保数据库和redis同步&#xff0c;为了方便我查询数据操作加了一些条件精准查询和模糊查询以及全字段模糊查询、分页、排序一些小玩意&#xff0c;redis存储是hash表key值也就是数据ID&…

(六)- DRM驱动开发(qcom)

一&#xff0c;Linux Android Display 1&#xff0c;Linux Android Display Software Subsystem 密 2&#xff0c;Linux Android Display Architecture 密 二&#xff0c;DRM/KMS Adreno DPU 1&#xff0c;硬件框图 密 1.1 Qualcomm Adreno DPU 8-Series Overview 密 …

游戏AI实现-寻路算法(GBFS)

贪婪最佳优先算法是宽度优先遍历和贪婪算法结合的产物&#xff0c;使用启发式函数选择当前最低代价的节点&#xff0c;改善了宽度优先遍历需要遍历地图的大量节点来找寻结果的缺点。 算法过程&#xff1a; 1.首先设置开始节点的启发函数值&#xff08;h&#xff09;为0&#…

[Unity]Unity跨平台开发之Android简介

Android要求和兼容 图形接口支持 注意&#xff1a; 新的 Unity 项目默认不支持 OpenGL ES 2.0。 由于硬件和图形 API 的限制&#xff0c;并非所有渲染管道都与 Android 兼容。 图片压缩 Android标准压缩格式是ETC和ASTC。Unity默认压缩格式是ASTC。如果Android设备不支持您选…

监控易在汽车制造行业信息化运维中的应用案例

引言 随着汽车制造行业的数字化转型不断深入&#xff0c;信息化类IT软硬件设备的运行状态监控、故障告警、报表报告以及网络运行状态监控等成为了企业运维管理的关键环节。监控易作为一款全面、高效的信息化运维管理工具&#xff0c;在汽车制造行业中发挥着重要作用。本文将结合…

python进行矩阵运算

python进行矩阵运算 一、矩阵相乘二、矩阵求逆三、矩阵特征值与特征向量求解四、矩阵约当标准型与转换矩阵求解五、矩阵奇异值分解六、矩阵方程组求解 一、矩阵相乘 python中矩阵相乘可以使用numpy实现&#xff0c;也可以使用sympy实现&#xff0c;以numpy实现为例&#xff0c…

Trimble天宝三维激光扫描仪在建筑工程竣工测量中的应用【沪敖3D】

竣工测量是建筑项目竣工阶段的一个至关重要的环节&#xff0c;它为建筑工程的质量验收和成果核查提供了核心的参考依据。传统的竣工测量方法&#xff0c;如全站仪测量&#xff0c;主要依赖于现场人工操作&#xff0c;存在一些明显的局限性&#xff0c;例如作业时间长、工作量大…

【JavaWeb后端学习笔记】Spring Task实现定时任务处理

Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 主要的应用场景有&#xff1a;纪念日提醒&#xff0c;处理订单未支付&#xff0c;还款提醒等。 1、corn表达式 使用Spring Task首先需要了解corn表达式&#xff0c;通过cor…

健康养生:拥抱生活的艺术

健康养生&#xff1a;拥抱生活的艺术 在快节奏的现代生活中&#xff0c;健康已成为我们最宝贵的财富。健康养生&#xff0c;不仅仅是一种生活方式的选择&#xff0c;更是一种对待生活的态度&#xff0c;它关乎于如何在日常中寻找到平衡&#xff0c;让身心得以滋养&#xff0c;…

【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】

目录&#x1f60b; <第1关&#xff1a;print 函数操作> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果&#xff1a; <第2关&#xff1a;转义字符使用> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果&#xff1a; <…

K8s ConfigMap的基础功能介绍

在 Kubernetes 中&#xff0c;ConfigMap 是一种用于管理配置信息的资源对象&#xff0c;它允许你将 配置信息与代码解耦&#xff0c;方便管理和更新应用配置&#xff0c;而无需重新构建镜像或重启服务。 ConfigMap 的功能 存储配置信息&#xff1a; 可以以 键值对 的形式存储配…

C++算法第九天

本篇文章我们继续学习c算法 目录 第一题 题目链接 题目展示 代码原理 暴力解法 二分解法 代码编写 第二题 题目链接 题目展示 代码原理 代码编写 重点回顾 朴素二分 非朴素二分 重点一 重点二 重点三 第一题 题目链接 153. 寻找旋转排序数组中的最小值 - 力…

Mysql学习笔记之SQL-2

上篇文章介绍了SQL语句的第一部分数据定义语言&#xff08;DDL)&#xff0c;这篇文章我们介绍SQL语句的第二部分&#xff0c;数据库操作语言&#xff08;DML&#xff09; 1.简介 DML全称&#xff08;Data Manipulation Language&#xff09;&#xff0c;用来对数据表中的数据…

Mybatisplus的学习

一、条件查询部分 在引入mybatisplus的依赖以后,我们不需要再引入mybatis的依赖,因为mybatisplus中已经包含mybatis的依赖。 1自动映射规则 变量名称:private String name 属性名:public String getName(){return name; } 这个getName 中的name就是属性名称 表名和实…