软件设计模式总结

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

创建型模式(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.mfbz.cn/a/781585.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot3+Vue3开发园区管理系统

介绍 在当今快速发展的城市化进程中,高效、智能的园区管理成为了提升居民生活品质、优化企业运营环境的关键。为此,我们精心打造了全方位、一体化的园区综合管理系统,该系统深度融合了园区管理、楼栋管理、楼层管理、房间管理以及车位管理等…

微信小程序消息通知(一次订阅)

在微信公众平台配置通知模版 通过wx.login获取code发送给后端 let that this // 登陆codewx.login({success: function (res) {if (res.code) {// 发送code到后端换取openid和session_keythat.setData({openCode: res.code})console.log(that.data.openCode, openCode);// 调…

【SpringBoot】SpringBoot内置Servlet容器源码分析-Tomcat

自动装配加载 ServletWebServerFactoryAutoConfiguration 在自动装配的时候,会加载spring.factories,并且添加到IOC容器中。这里包含web自动配置类ServletWebServerFactoryAutoConfiguration ,其中本类中注入三个bean,分别是Embed…

【数据结构与算法】插入排序

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​

Ollama报错:Error: llama runner process has terminated: exit status 0xc0000409

0,背景 今天听说谷歌家的Gemma2性能很好,于是在Ollama上下载到本地测试一下 ollama run gemma2 结果终端里报错 Error: llama runner process has terminated: exit status 0xc0000409 1,原因 原因很简单,新的模型&#xff…

vue项目实现堆叠卡片拖动切换效果

实际效果 实现流程 1. 实现卡片位置堆叠 将父元素的 position 设置成relative ,卡片的position 设置成 absolute 即可。 2. 消除图片的移动 如果卡片上有图片,默认拖动的时候就会导致像上图一样变成了选中图片移动,从而没法触发拖动事件。消…

Canal架构以及使用规范

Canal架构以及使用规范 一、Canal的作用 相关文档:GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可…

上网监控软件有哪些?3款实力出众的上网监控软件

为什么需要上网监控软件? 据说,99%的员工上班都会摸鱼,1%的员工上班会窃取公司信息。 所以,因此,监控员工的上网行为是很有必要滴。 总结下来,上网监控软件的作用是: 1.提高生产力&#xff1…

Vben:表格的表头和表格的内容对不齐,以及解决方法

文章目录 一、问题描述二、解决方法 一、问题描述 基于Vue-Vbne-admin框架进行前端开发的时候,调用表格useTable函数实现表格之后,发现表格的表头和表格的内容对不齐。如下图所示。针对这种情况,本文记录了解决方法。 调用的模块如下&#x…

1958.力扣每日一题7/7 Java(100%解)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先将指定位…

浏览器插件利器-allWebPluginV2.0.0.14-stable版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

并查集(还有反集也在)

一.定义 定义: 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。 主要构成: 并查集…

2-27 基于matlab的一种混凝土骨料三维随机投放模型

基于matlab的一种混凝土骨料三维随机投放模型,为混凝土细观力学研究提供一种快捷的三维建模源代码。可设置骨料数量,边界距离、骨料大小等参数。程序已调通,可直接运行。 2-27 matlab 混凝土骨料三维随机投放模型 - 小红书 (xiaohongshu.com)…

Redis 7.x 系列【16】持久化机制之 AOF

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 执行原理2.1 Redis 6.x2.1.1 直接写2.1.2 重写 2.2 Redis 7.x2.2.1 直接写2…

PTA甲级1005:Spell It Right

错误代码&#xff1a; #include<iostream> #include<vector> #include<unordered_map> using namespace std;int main() {unordered_map<int, string> map {{0, "zero"}, {1, "one"}, {2, "two"}, {3, "three&qu…

线程安全的原因及解决方法

什么是线程安全问题 线程安全问题指的是在多线程编程环境中&#xff0c;由于多个线程共享数据或资源&#xff0c;并且这些线程对共享数据或资源的访问和操作没有正确地同步&#xff0c;导致数据的不一致、脏读、不可重复读、幻读等问题。线程安全问题的出现&#xff0c;通常是…

【大数据综合试验区1008】揭秘企业数字化转型:大数据试验区政策数据集大公开!

今天给大家分享的是国内顶级期刊中国工业经济2023年发布的最新期刊《政策赋能、数字生态与企业数字化转型——基于国家大数据综合试验区的准自然实验》文章中所使用到的数据集——国家大数据综合试验区政策数据集以及工具变量数据&#xff0c;该文章基于2009-2019年中国上市企业…

两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码

今天推荐两个全开源的3D模型素材下载网站源码 3D图纸模型素材 三维图形素材会员下载站源码&#xff0c;这两个源码完整&#xff0c;都是基于thinkphp内核开发的&#xff0c;框架稳定&#xff0c;带数据库&#xff0c;源码文件&#xff0c;可以直接部署使用。 第一个&#xff1a…

【数据结构与算法】快速排序挖坑法

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​