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
  • También conocido como
  • Estructura
  • Participantes
  • Implementación
  • Código de ejemplo

¿Te fue útil?

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

Decorator

AnteriorProxySiguienteFacade

Última actualización hace 5 años

¿Te fue útil?

Propósito

Según el libro "Patrones de Diseño" el patrón Decorator "asigna responsabilidades adicionales a un objeto dinámicamente, proporcionando una alternativa flexible a la herencia para extender la funcionalidad".

También conocido como

Wrapper (Envoltorio)

Estructura

Participantes

  • Componente:

    • define la interfaz para variables a las que se puede añadir responsabilidades dinámicamente.

  • ComponenteConcreto:

    • define una variable a la que se pueden añadir responsabilidades adicionales.

  • Decorador:

    • mantiene una referencia a una variable Componente y define una interfaz que se ajusta a la interfaz del Componente.

  • DecoradorConcreto:

    • añade responsabilidades al componente.

Implementación

No se observan impedimentos y/o modificaciones de la estructura original del patrón para su implementación en Go.

Código de ejemplo

En este ejemplo queremos agregarle dinámicamente ingredientes adicionales a un café que por defecto viene simple.

Implementación:

// Componente Interface
type CafeInterface interface {
    GetCosto() int
    GetDetalle() string
}

// Componente Concreto
type Cafe struct{}

func (c *Cafe) GetCosto() int {
    return 30
}

func (c *Cafe) GetDetalle() string {
    return "Cafe"
}

// Decorador
type CafeDecorador struct {
    CafeInterface
}

func (cd *CafeDecorador) GetCosto() int {
    return cd.CafeInterface.GetCosto()
}

func (cd *CafeDecorador) GetDetalle() string {
    return cd.CafeInterface.GetDetalle()
}

// Decorador Concreto
type CafeConCrema struct {
    *CafeDecorador
}

func (ccc *CafeConCrema) GetCosto() int {
    return ccc.CafeDecorador.GetCosto() + 15
}

func (ccc *CafeConCrema) GetDetalle() string {
    return ccc.CafeDecorador.GetDetalle() + " con crema"
}

// Decorador Concreto
type CafeConCanela struct {
    *CafeDecorador
}

func (ccc *CafeConCanela) GetCosto() int {
    return ccc.CafeDecorador.GetCosto() + 10
}

func (ccc *CafeConCanela) GetDetalle() string {
    return ccc.CafeDecorador.GetDetalle() + " con canela"
}

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

cafe := &Cafe{}
fmt.Printf("Detalle: %s - Importe $%d\n", cafe.GetDetalle(), cafe.GetCosto())

cafeConCrema := &CafeConCrema{&CafeDecorador{cafe}}
fmt.Printf("Detalle: %s - Importe $%d\n", cafeConCrema.GetDetalle(), cafeConCrema.GetCosto())

cafeConCremaConCanela := &CafeConCanela{&CafeDecorador{cafeConCrema}}
fmt.Printf("Detalle: %s - Importe $%d\n", cafeConCremaConCanela.GetDetalle(), cafeConCremaConCanela.GetCosto())

|

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]