Design Patterns in Go
  • Portada
  • Introducción
  • Publicación
  • Parte I
    • Sobre Go
    • POO en Go
      • Objetos
      • Herencia / Composición
      • S.O.L.I.D
  • Parte II
    • Patrones de Diseño
      • GoF
      • Patrones de Comportamiento
        • Strategy
        • Chain of Responsibility
        • Command
        • Template Method
        • Memento
        • Interpreter
        • Iterator
        • Visitor
        • State
        • Mediator
        • Observer
      • Patrones Creacionales
        • Singleton
        • Builder
        • Factory Method
        • Abstract Factory
        • Prototype
      • Patrones Estructurales
        • Composite
        • Adapter
        • Bridge
        • Proxy
        • Decorator
        • Facade
        • Flyweight
  • Parte III
    • Conclusiones
    • Acerca De
  • Recursos de interés
  • Glosario
Con tecnología de GitBook
En esta página
  • Propósito
  • Estructura
  • Participantes
  • Implementación
  • Código de ejemplo

¿Te fue útil?

  1. Parte II
  2. Patrones de Diseño
  3. Patrones de Comportamiento

Chain of Responsibility

AnteriorStrategySiguienteCommand

Última actualización hace 5 años

¿Te fue útil?

Propósito

Según el libro "Patrones de Diseño" el patrón Chain of Responsibility "evita acoplar el emisor de una petición a su receptor, dando a más de un objeto la posibilidad de responder a la petición. Encadena los objetos receptores y pasa la petición a través de la cadena hasta que es procesada por algún objeto".

Estructura

Participantes

  • Manejador:

    • define una interfaz para tratar las peticiones.

    • (opcional) implementa el enlace al sucesor.

  • ManejadorConcreto:

    • trata las peticiones de las que es responsable.

    • puede acceder a su sucesor.

    • si el ManejadorConcreto puede manejar la petición, lo hace; en caso contrario la reenvía a su sucesor.

  • Cliente:

    • inicializa la petición a una variable ManejadorConcreto de la cadena.

Implementación

  • No se observan impedimentos para su implementación en Go.

  • La implementación de la clase abstracta Manejador debe reemplazarse por una interface dado que no existe la herencia de clase en Go.

  • Si fuese necesario que Manejador implementase código común a los ManejadoresConcretos se podrá definir un tipo de dato adicional (ManejadorComun por ejemplo) y el mismo deberá implementarse en cada ManejadorConcreto mediante el uso de la composición.

Código de ejemplo

En este ejemplo se definen dos receptores distintos de mensajes. Uno para mensajes de alta prioridad y otro para mensajes de baja prioridad. El mensaje enviado por el cliente es transmitido a través de la cadena de receptores y cada receptor trata o no el mensaje de acuerdo a su prioridad.

Implementación:

// Interface
type Receptor interface {
    ProcesarMensaje(int, string) string
}

// Receptor de Alta Prioridad
type ReceptorAltaPrioridad struct{
    siguiente Receptor
}

func (rap ReceptorAltaPrioridad) ProcesarMensaje(prioridad int, mensaje string) string {
    if prioridad >= 5 {
       return "Procesando mensaje de alta prioridad: " + mensaje
    }

    if rap.siguiente != nil {
       return rap.siguiente.ProcesarMensaje(prioridad, mensaje)
    }

    return ""
}

// Receptor de Baja Prioridad
type ReceptorBajaPrioridad struct{
    siguiente Receptor
}

func (rbp ReceptorBajaPrioridad) ProcesarMensaje(prioridad int, mensaje string) string {
    if prioridad < 5 {
       return "Procesando mensaje de baja prioridad: " + mensaje
    }

    if rbp.siguiente != nil {
       return rbp.siguiente.ProcesarMensaje(prioridad, mensaje)
    }

    return ""
}

Se puede probar la implementación del patrón de la siguiente forma:

manejadores := ReceptorBajaPrioridad {
    siguiente: ReceptorAltaPrioridad {},
}

fmt.Println(manejadores.ProcesarMensaje(4, "Mensaje 1 - Prioridad 4"))
fmt.Println(manejadores.ProcesarMensaje(5, "Mensaje 2 - Prioridad 5"))
fmt.Println(manejadores.ProcesarMensaje(10, "Mensaje 3 - Prioridad 10"))

|

Atención: Esta publicación se encuentra abandonada. Puede acceder a la versión vigente en

Código de ejemplo
Ejecutar código
https://leanpub.com/designpatternsingo
[29]