Compartir tecnología

Resumen de patrones de diseño de software.

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Los patrones de diseño son soluciones generales a problemas comunes en el diseño de software. Los siguientes son algunos patrones de diseño comunes, divididos en tres categorías principales: patrones de creación, patrones estructurales y patrones de comportamiento.

Patrones creacionales

Estos patrones proporcionan mecanismos para la creación de objetos, aumentando la flexibilidad y la reutilización del código existente.

  1. Patrón singleton

    • Asegúrese de que solo haya una instancia de una clase y proporcione un punto de acceso global.
  2. Patrón de método de fábrica

    • Defina la interfaz para crear objetos y deje que las subclases decidan qué clase crear una instancia.
  3. Patrón de fábrica abstracta (fábrica abstracta)

    • Cree familias de objetos relacionados o dependientes sin especificar explícitamente clases concretas.
  4. Patrón de constructor (Constructor)

    • Construya un objeto complejo y permita la construcción paso a paso.
  5. Prototipo

    • Cree una nueva instancia copiando una instancia existente, en lugar de crear una nueva.

Patrones estructurales

Estos patrones tratan de combinaciones de objetos o relaciones entre objetos y ellos.

  1. Modo adaptador

    • Permite resolver incompatibilidades de interfaz entre objetos mediante un "adaptador".
  2. Patrón decorador (Decorador)

    • Agregue dinámicamente responsabilidades adicionales a un objeto.
  3. Modo proxy (Proxy)

    • Proporciona un sustituto o marcador de posición para que otro objeto controle el acceso a él.
  4. Fachada

    • Proporciona una interfaz unificada de alto nivel para acceder a un grupo de interfaces en el subsistema.
  5. Modo puente (Puente)

    • Separar la parte abstracta de su implementación para que puedan variar de forma independiente.
  6. Modo compuesto

    • Agrupe objetos en una estructura de árbol para representar una jerarquía parte-todo.
  7. Modo peso mosca

    • Admite de manera eficiente una gran cantidad de objetos detallados mediante el uso compartido.

Patrones de comportamiento

Estos patrones se centran en la comunicación entre objetos, es decir, cómo los objetos interactúan y distribuyen responsabilidades.

  1. Estrategia

    • Defina una serie de algoritmos, encapsúlelos uno por uno y hágalos intercambiables.
  2. Patrón de método de plantilla (método de plantilla)

    • Defina el marco del algoritmo en el método y difiera la implementación a las subclases.
  3. Patrón de observador (Observador)

    • Relación de dependencia de uno a muchos entre objetos Cuando un objeto cambia de estado, todos los objetos que dependen de él serán notificados y actualizados automáticamente.
  4. Patrón iterador (iterador)

    • Acceda a elementos individuales en un objeto agregado de forma secuencial sin exponer su representación interna.
  5. Modelo de cadena de responsabilidad

    • Brinde a varios objetos la oportunidad de manejar la solicitud, evitando así el acoplamiento entre el remitente y el receptor de la solicitud.
  6. Modo de comando (Comando)

    • Encapsula la solicitud como un objeto, permitiendo al usuario parametrizar al cliente con diferentes solicitudes.
  7. Modo recuerdo

    • Capture el estado interno de un objeto y guarde este estado fuera del objeto sin romper la encapsulación.
  8. Modo de estado

    • Permite que un objeto cambie su comportamiento cuando cambia su estado interno.
  9. Modo visitante

    • Agregue nuevas capacidades a una estructura de objeto (como una estructura compuesta).
  10. Patrón mediador

    • Defina un objeto intermediario para simplificar la interacción entre los objetos originales.
  11. Modo intérprete (Intérprete)

    • Definir una representación gramatical de un idioma e interpretar las oraciones definidas en ese idioma.

Durante la última entrevista, me preguntaron sobre el uso de código para implementar el patrón suscriptor-editor. Tuve tiempo para simular estos patrones de diseño con código js.

Por ejemplo

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');
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70

En este ejemplo,PubSub La clase proporciona la siguiente funcionalidad:

  • subscribe El método permite a los suscriptores registrar una función de devolución de llamada para un evento específico.
  • unsubscribe El método permite a los suscriptores cancelar el registro de sus funciones de devolución de llamada de eventos específicos.
  • unsubscribeAll El método cancela todas las suscripciones a un evento específico.
  • emit El método desencadena el evento y ejecuta las funciones de devolución de llamada de todos los suscriptores.
  • hasSubscribers El método comprueba si hay suscriptores para un evento específico.