• 软件设计模式总结


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

    创建型模式(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 方法检查特定事件是否有订阅者。
  • 相关阅读:
    基于文化算法优化的神经网络预测研究(Matlab代码实现)
    如何使用 React 和 Docusaurus 编写的一些自定义钩子(Hook)
    【FPGA】十进制计数器 | 实现 4-bit 2421 十进制计数器 | 有限状态机(FSM)
    计算机智能专题-遗传算法(1不带约束的)
    【遥感变化检测综述】—《多时相遥感影像的变化检测研究现状与展望》
    最新 Hugging Face 强化学习课程(中文版)来啦!
    以结构体为键值时的map报错
    火锅+自助+美蛙,青客宴如何从火锅细分渠道突破
    Kotlin协程-select基础
    C-结构体
  • 原文地址:https://blog.csdn.net/ZTBztb123456/article/details/140253333