Hej, właśnie obniżyłem ceny wszystkich produktów. Przygotujmy nasze umiejętności programowania na erę post-COVID. Więcej szczegółów »
Dekorator

Dekorator w języku Go

Dekorator to strukturalny wzorzec pozwalający na dodawanie obiektom nowych obowiązków w sposób dynamiczny — poprzez “opakowywanie” ich w specjalne obiekty posiadające potrzebną funkcjonalność.

Stosując dekoratory można opakowywać obiekty wielokrotnie, gdyż zarówno obiekt docelowy jak i dekoratory są zgodne pod względem interfejsu. Wynikowy obiekt będzie posiadał ułożoną w formie stosu połączoną funkcjonalność wszystkich “opakowań”.

Przykład koncepcyjny

pizza.go: Interfejs komponentu

package main

type pizza interface {
	getPrice() int
}

veggieMania.go: Konkretny komponent

package main

type veggeMania struct {
}

func (p *veggeMania) getPrice() int {
	return 15
}

tomatoTopping.go: Konkretny dekorator

package main

type tomatoTopping struct {
	pizza pizza
}

func (c *tomatoTopping) getPrice() int {
	pizzaPrice := c.pizza.getPrice()
	return pizzaPrice + 7
}

cheeseTopping.go: Konkretny dekorator

package main

type cheeseTopping struct {
	pizza pizza
}

func (c *cheeseTopping) getPrice() int {
	pizzaPrice := c.pizza.getPrice()
	return pizzaPrice + 10
}

main.go: Kod klienta

package main

import "fmt"

func main() {

	pizza := &veggeMania{}

	//Add cheese topping
	pizzaWithCheese := &cheeseTopping{
		pizza: pizza,
	}

	//Add tomato topping
	pizzaWithCheeseAndTomato := &tomatoTopping{
		pizza: pizzaWithCheese,
	}

	fmt.Printf("Price of veggeMania with tomato and cheese topping is %d\n", pizzaWithCheeseAndTomato.getPrice())
}

output.txt: Wynik działania


Na podstawie: Golang By Example

Dekorator w innych językach

Wzorce projektowe: Dekorator w języku Java Wzorce projektowe: Dekorator w języku C# Wzorce projektowe: Dekorator w języku C++ Wzorce projektowe: Dekorator w języku PHP Wzorce projektowe: Dekorator w języku Python Wzorce projektowe: Dekorator w języku Ruby Wzorce projektowe: Dekorator w języku Swift Wzorce projektowe: Dekorator w języku TypeScript