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

ops/2024/12/19 0:21:07/

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

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

最佳自学课程

目录

一、观察者模式

Java

TypeScript


一、观察者模式

Java

观察者(实现者)抽象类 

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;}
}

主题接口 

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

主题(命令) 实现类

java">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);}}
}

观察者实现类 

java">/*** 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)) );}
}
java">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() );}
}
java">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)) );}
}
java">
/*** 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。** 当对象间存在一对多关系时,则使用观察者模式(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.ppmy.cn/ops/143030.html

相关文章

Databend 为什么使用 Rust 开发?

11 月 30 日&#xff0c;Rust China Tour 武汉站在武汉恺德光谷城际酒店举行。本次活动汇聚了来自 Databend、GreptimeDB、华中科技大学的多位 Rust 技术专家和研究者&#xff0c;共同探讨 Rust 语言在前沿技术中的创新应用。Databend 数据库研发工程师张祖前在活动中带来主题演…

详解MySQL在Windows上的安装

目录 查看电脑上是否安装了MySQL 下载安装MySQL 打开MySQL官网&#xff0c;找到DOWNLOADS 然后往下翻&#xff0c;找到MySQL Community(GPL) Downloads>> 然后找到MySQL Community Server 然后下载&#xff0c;选择No thanks,just start my download. 然后双击进行…

跑步训练(蓝桥杯2020试题A)

【问题描述】 小明要进行一个跑步训练。初始时&#xff0c;小明体力充沛&#xff0c;体力值计为10000。小明跑步时每分钟损耗600体力值。小明休息时每分钟增加300体力值。体力值的损耗和增加都是均匀变化的。 小明打算跑一分钟&#xff0c;休息一分钟&#xff0c;再跑一分钟&am…

leetcode69:x的平方根

原题地址&#xff1a;69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用…

uniapp 应用的生命周期、页面的生命周期、组件的生命周期

uniapp 作为一款跨平台的移动应用开发框架&#xff0c;其生命周期分为应用生命周期、页面生命周期和组件生命周期。下面分别介绍这三种生命周期的具体内容&#xff1a; 应用生命周期 应用生命周期仅适用于整个应用&#xff0c;在 App.vue 中可以监听到以下生命周期函数&#…

FastJson反序列化学习-01

&#x1f338; FastJson FastJson是一个由阿里巴巴开发的高性能JSON处理库&#xff0c;支持Java对象与JSON字符串之间的互相转换。 本次漏洞研究基于FastJson的1.2.24版本。也就是最早出现FastJson反序列化漏洞的版本。 CVE-2017-18349&#xff0c;FastJson<1.2.24 &…

SQL 标准定义了哪些事务隔离级别?

SQL标准定义了四个事务隔离级别&#xff0c;它们分别是&#xff1a; READ UNCOMMITTED&#xff08;读取未提交&#xff09;&#xff1a; 最低的隔离级别。允许读取尚未提交的数据变更。可能会导致脏读、幻读或不可重复读。脏读是指一个事务可以读取到另一个事务未提交的数据。 …

ADB在浏览器中:ya-webadb项目安装与配置完全指南

ADB在浏览器中&#xff1a;ya-webadb项目安装与配置完全指南 ya-webadb ADB in your browser [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/ya/ya-webadb 项目基础介绍与编程语言 ya-webadb 是一个由 Yume-chan 开发的开源项目&#xff0c;它实现了ADB&#x…