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

news/2024/12/17 17:44:40/

 设计模式(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/news/1555910.html

相关文章

safe area helper插件

概述 显示不同机型的必能显示的区域 实现步骤 引入safearea&#xff0c;引入其中的safearea的csharp 为cancas加入gameobject gameobject中加入safearea脚本 将UI作为这个gameobject的子物体&#xff0c;就可以完成显示

E2PROM STM32使用I2C协议驱动

关于E2PROM 使用E2PROM可以保存数据&#xff0c;特点就是掉电不丢失。 在我们CT107D开发板上所使用的的器件是AT24C02&#xff0c;一个容量大小是2Kb/s&#xff0c;也就是256字节的E2PROM。 24C02是一个基于I2C通信协议的器件。 24C01/02/04/08/16 是低工作电压的1K/2K/4K/…

scala转义序列

在字符串或字符字面值中可以有以下转义序列&#xff1a; \b \t \u0008:退格 BS \u0090:水平制表符 HT 7 空白与注释 \n \f \r \” \‟ \\ \u000a:换行 LF \u000c: 格式进纸FF \u000d:回车 CR \u0022:双引号 ” \u0027:单引号 ‟ \u005c:反斜线 \ 0 到 255 间的 Unicode…

Vue 2 中 v-html 指令的使用详解

目录 Vue 2 中 v-html 指令的使用详解 v-html 简介 基本语法 使用场景与示例 示例 1&#xff1a;基础用法 示例 2&#xff1a;动态更新 HTML 内容 注意事项 XSS 风险 安全建议&#xff1a; 性能考虑 最佳实践 Vue 2 中 v-html 指令的使用详解 Vue.js 是一个用于构建…

Ps:视频动作

Ps菜单&#xff1a;窗口/动作 Window/Actions 快捷键&#xff1a;Alt F9 视频动作 Video Actions组中的动作主要用于 Photoshop 的视频编辑&#xff0c;包括创建和反转 Alpha 通道、调整亮度和饱和度以符合广播标准、格式化 NTSC 和 PAL DVD 幻灯片&#xff0c;以及添加标题安…

代码随想录算法训练营day43|动态规划part10

今天的是子序列问题&#xff0c;第二题难度不大&#xff0c;可以采用类似贪心的思路求解。第一题的思想比较新颖&#xff0c;注意dp[i]是以i为末尾元素的最长递增子序列&#xff0c;可以用两层循环&#xff0c;第二层循环遍历从0到i-1&#xff0c;通过不断更新dp[i]的值求解最长…

游戏引擎学习第52天

仓库 : https://gitee.com/mrxiao_com/2d_game 这节的内容相当多 回顾 在游戏中&#xff0c;实体被分为不同的类别&#xff1a;接近玩家的“高频实体”、距离较远并正在模拟的“低频实体”和不进行更新的“休眠实体”。这些实体会根据它们与玩家的距离进行处理&#xff0c;接…

在Spring Boot中的实现国际化(i18n)

1.什么是国际化&#xff08;i18n&#xff09;&#xff1f; 国际化&#xff08;Internationalization&#xff0c;简称i18n&#xff09;是指在软件应用中支持多种语言和文化的能力。通过国际化&#xff0c;应用可以根据用户的语言和地区设置&#xff0c;动态地显示不同的文本内…