软件设计模式总结

设计模式是软件设计中常见问题的通用解决方案。以下是一些常见的设计模式,分为三大类:创建型模式、结构型模式和行为型模式。

创建型模式(Creational Patterns)

这些模式提供了对象创建的机制,增加了已有代码的灵活性和可复用性。

  1. 单例模式(Singleton)

    • 确保一个类只有一个实例,并提供一个全局访问点。
  2. 工厂方法模式(Factory Method)

    • 定义创建对象的接口,让子类决定实例化哪一个类。
  3. 抽象工厂模式(Abstract Factory)

    • 创建相关或依赖对象的家族,而不需明确指定具体类。
  4. 建造者模式(Builder)

    • 构建一个复杂的对象,并允许按步骤构造。
  5. 原型模式(Prototype)

    • 通过拷贝现有的实例创建新的实例,而不是通过新建。

结构型模式(Structural Patterns)

这些模式处理对象组合,或对象与它们之间的关系。

  1. 适配器模式(Adapter)

    • 允许对象间的接口不兼容问题通过一个“适配器”来解决。
  2. 装饰器模式(Decorator)

    • 动态地给一个对象添加额外的职责。
  3. 代理模式(Proxy)

    • 为另一个对象提供一个代替或占位符,以控制对它的访问。
  4. 外观模式(Facade)

    • 提供一个统一的高层接口,用于访问子系统中的一群接口。
  5. 桥接模式(Bridge)

    • 将抽象部分与其实现部分分离,使它们可以独立地变化。
  6. 组合模式(Composite)

    • 将对象组合成树形结构,以表示“部分-整体”的层次结构。
  7. 享元模式(Flyweight)

    • 通过共享来高效地支持大量细粒度的对象。

行为型模式(Behavioral Patterns)

这些模式专注于对象间的通信,即对象如何相互作用以及怎样分配职责。

  1. 策略模式(Strategy)

    • 定义一系列算法,把它们一个个封装起来,并使它们可互换。
  2. 模板方法模式(Template Method)

    • 在方法中定义算法的框架,延迟到子类中实现。
  3. 观察者模式(Observer)

    • 对象间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会被通知并自动更新。
  4. 迭代器模式(Iterator)

    • 顺序访问一个聚合对象中的各个元素,不暴露其内部的表示。
  5. 责任链模式(Chain of Responsibility)

    • 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
  6. 命令模式(Command)

    • 将请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化。
  7. 备忘录模式(Memento)

    • 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
  8. 状态模式(State)

    • 允许一个对象在其内部状态发生改变时改变其行为。
  9. 访问者模式(Visitor)

    • 为一个对象结构(如组合结构)增加新能力。
  10. 中介者模式(Mediator)

    • 定义一个中介对象来简化原有对象之间的交互。
  11. 解释器模式(Interpreter)

    • 定义一种语言的文法表示,并且解释该语言中定义的句子。

上次面试的时候被问到用代码实现订阅-发布者模式,有时间用js代码模拟一下这些设计模式。

For example

class PubSub {constructor() {this.events = {}; // 存储事件名称和对应的订阅者回调函数数组}// 订阅事件subscribe(event, callback) {if (!this.events[event]) {this.events[event] = []; // 如果事件不存在,初始化一个空数组}this.events[event].push(callback); // 将回调函数添加到订阅者的数组}// 取消订阅事件unsubscribe(event, callback) {if (!this.events[event]) {return;}this.events[event] = this.events[event].filter(cb => cb !== callback); // 移除指定的回调函数}// 取消特定事件的所有订阅unsubscribeAll(event) {if (this.events[event]) {delete this.events[event]; // 删除所有订阅者}}// 触发事件,使用 emit 作为方法名emit(event, data) {if (this.events[event]) {// 执行所有订阅者的回调函数this.events[event].forEach(callback => callback(data));}}// 检查是否有订阅者hasSubscribers(event) {return this.events[event] && this.events[event].length > 0;}
}// 使用示例
const eventCenter = new PubSub();// 订阅 'message' 事件
eventCenter.subscribe('message', (data) => {console.log(`Message received: ${data}`);
});// 订阅 'greet' 事件
eventCenter.subscribe('greet', (name) => {console.log(`Hello, ${name}!`);
});// 触发 'message' 事件
eventCenter.emit('message', 'Hello, Pub/Sub!');// 触发 'greet' 事件
eventCenter.emit('greet', 'World');// 取消对 'message' 事件的订阅
const myCallback = (data) => {console.log(`My callback received: ${data}`);
};
eventCenter.subscribe('message', myCallback);
eventCenter.unsubscribe('message', myCallback);// 再次触发 'message' 事件,myCallback 不会被调用
eventCenter.emit('message', 'This message will not be received by myCallback');

在这个例子中,PubSub 类提供了以下功能:

  • subscribe 方法允许订阅者注册一个回调函数到特定的事件。
  • unsubscribe 方法允许订阅者从特定事件中注销其回调函数。
  • unsubscribeAll 方法取消特定事件的所有订阅。
  • emit 方法触发事件,执行所有订阅者的回调函数。
  • hasSubscribers 方法检查特定事件是否有订阅者。

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

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

相关文章

electron 初始使用

electron electron文档地址deno下载地址安装命令 yarn config set electron_mirror https://cdn.npm.taobao.org/dist/electron/ npm install下载文件 文件下载完成后,新建dist目录,解压到list目录下;path文件中写入electron.exe 运行命令 …

排序格式排序格式

排序格式排序格式

P5. 微服务: Bot代码的执行

P5. 微服务: Bot代码的执行 0 概述1 Bot代码执行框架2 Bot代码传递给BotRunningSystem3 微服务: Bot代码执行的实现逻辑3.1 整体微服务逻辑概述3.2 生产者消费者模型实现3.3 consume() 执行代码函数的实现3.4 执行结果返回给 nextStep 4 扩展4.1 Bot代码的语言 0 概述 本章介绍…

什么是CNN,它和传统机器学习有什么区别

CNN,全称为卷积神经网络(Convolutional Neural Networks),是一种专门用于处理具有网格结构数据(如图像、视频)的深度学习模型。它由多个卷积层、池化层、全连接层等组成,通过卷积运算和池化操作…

Vulnhub靶场DC-5练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 利用burpsuite爆破文件包含的参数2. 文件包含3. nginx日志挂马4. 反弹shell5.漏洞利用和提权 0x04 总结 0x00 准备 下载链接:https://download.vulnhub.com/dc/DC-5.zip 介绍: …

kafka-3

Kafka 消费组 consumer-offsets-N 稀疏索引 Kafka集群 集群搭建 集群启动和验证 Topic的意义 Topic和Partition 分区 副本 集群操作指令 多分区&多副本 多分区消费组 Rebalance机制 Rebalance机制处理流程 Rebalance机制-Range Rebalance机制-RoudRobin Rebalance机制-St…

计数排序的实现

原理 对一个数组进行遍历,再创建一个count数组 每找到一个值则在count数组中对应的位置加一,再在count数组中找到数字上方的count值,count值为几,则打印几次数组中的值. 开空间 相对映射 排序的实现 void CountSort(int* a, i…

PageHelper分页查询遇到的小问题

如果我们是这样子直接查询 pagehelper会拼接导我们的sql语句之后 这样子我们搜索出来的list&#xff0c;就是里面参杂了PageHelper的东西 所以我们可以直接转成我们的Page类型 但是如果我们搜索出来的是List<Blog>&#xff0c;我有些信息不想返回给前端&#xff0c;所以…

mac M1安装 VSCode

最近在学黑马程序员Java最新AI若依框架项目开发&#xff0c;里面前端用的是Visual Studio Code 所以我也就下载安装了一下&#xff0c;系统是M1芯片的&#xff0c;安装过程还是有点坑的写下来大家注意一下 1.在appstore中下载 2.在系统终端中输入 clang 显示如下图 那么在终端输…

C++语言相关的常见面试题目(一)

1. const关键字的作用 答&#xff1a; 省流&#xff1a;&#xff08;1&#xff09;定义变量&#xff0c;主要为了防止修改 (2) 修饰函数参数&#xff1a;防止在函数内被改变 &#xff08;3&#xff09;修饰函数的返回值 &#xff08;4&#xff09;修饰类中的成员函数 2. Sta…

Rust入门实战 编写Minecraft启动器#1启动方法

首发于Enaium的个人博客 引言 想必大家都知道Minecraft这个游戏&#xff0c;它是一个非常有趣的游戏&#xff0c;有没有想过它是如何启动的呢&#xff1f;在本系列中&#xff0c;我们将使用Rust编写一个简单的Minecraft启动器。 本系列文章涉及的Rust知识并不多&#xff0c;了…

并发编程-05AQS原理

并发编程-深入理解AQS之ReentrantLock 一 认识AQS 在讲解AQS原理以及相关同步器之前&#xff0c;我们需要对AQS有一些基本的认识&#xff0c;了解下它有什么样的机制&#xff0c;这样追踪源码的时候就不会太过于迷茫&#xff01; 1.1 什么是AQS java.util.concurrent包中的大…

【DevOps】运维过程中经常遇到的Http错误码问题分析(二)

目录 一、HTTP 错误400 Bad Request 1、理解 400 Bad Request 错误 2、排查 400 Bad Request 错误 3、常见的解决方法 二、HTTP 错误401 Unauthorized 1、理解 401 Unauthorized 错误 2、排查 401 Unauthorized 错误 3、常见的解决方法 一、HTTP 错误400 Bad Request …

文件上传漏洞: 绕过方式及原理[表格]

序号绕过原理原理简述详细技术解释绕过方法1前端校验绕过禁用或绕过前端JavaScript验证前端JavaScript用于限制用户上传文件类型&#xff0c;但可被用户禁用或修改使用浏览器插件或开发者工具禁用JavaScript&#xff0c;或修改上传逻辑2MIME类型欺骗更改文件MIME类型以欺骗服务…

海康威视摄像头批量更改源码

更改OSD通道名称 # codingutf-8 import os import time import requests from requests.auth import HTTPBasicAuth, HTTPDigestAuth import xml.etree.ElementTree as ET#和监控摄像头通讯需要一个双方认可的密钥&#xff0c;可以随机生成 def generate_key():# 生成一个16字…

LabVIEW与OpenCV图像处理对比

LabVIEW和OpenCV在图像处理方面各有特点。LabVIEW擅长图形化编程、实时处理和硬件集成&#xff0c;而OpenCV则提供丰富的算法和多语言支持。通过DLL、Python节点等方式&#xff0c;OpenCV的功能可在LabVIEW中实现。本文将结合具体案例详细分析两者的特点及实现方法。 LabVIEW与…

某大会的影响力正在扩大,吞噬了整个数据库世界!

1.规模空前 你是否曾被那句“上有天堂&#xff0c;下有苏杭”所打动&#xff0c;对杭州的湖光山色心驰神往&#xff1f;7月&#xff0c;正是夏意正浓的时节&#xff0c;也是游览杭州的最佳时期。这座古典与现代交融的城市将迎来了第13届PostgreSQL中国技术大会。作为全球数据库…

kubebuilder示例-新

生成代码 因为kubebuilder 命令工具需要依赖linux环境 所以本例方法使用git 同步代码 在window开发后提交 linux项目里拉代码运行的方式 创建go mod 项目 go mod init kubebuild_demo 初始化项目 生成基础框架 domain 生成group用的 kubebuilder init --domain example.com …

LabVIEW从测试曲线中提取特征值

在LabVIEW中开发用于从测试曲线中提取特征值的功能时&#xff0c;可以考虑以下几点&#xff1a; 数据采集与处理&#xff1a; 确保你能够有效地采集和处理测试曲线数据。这可能涉及使用DAQ模块或其他数据采集设备来获取曲线数据&#xff0c;并在LabVIEW中进行处理和分析。 特…

系统级别的原生弹窗窗口

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原生的弹出窗口dialog</title><style>…