1. Co to jest wzorzec strategii
Wzorzec strategii jest wzorcem projektowym behawioralnym, który pozwala nam wybierać różne algorytmy lub zachowania w zależności od różnych sytuacji. Pakuje on różne algorytmy w osobne klasy strategii i pozwala tym klasom strategii na wymienne użycie. Korzystając z wzorca strategii, możemy dynamicznie zmieniać zachowanie obiektu podczas działania bez bezpośredniej modyfikacji struktury obiektu.
2. Charakterystyka i zalety wzorca strategii
Wzorzec strategii ma następujące cechy i zalety:
- Klasa strategii może się niezależnie zmieniać, dodanie nowej klasy strategii nie wpływa na oryginalny kod, zgodnie z zasadą otwarte-zamknięte.
- Klienci mogą wybierać różne strategie według potrzeb, zgodnie z zasadą pojedynczej odpowiedzialności.
- Wzorzec strategii zapewnia ponowne wykorzystanie algorytmów lub zachowań, unikając duplikacji kodu.
- Wzorzec strategii zapewnia lepszy sposób organizowania kodu, co sprawia, że kod jest bardziej czytelny i łatwiejszy w utrzymaniu.
3. Przykłady praktycznych zastosowań wzorca strategii
Wzorzec strategii jest powszechnie stosowany w następujących scenariuszach:
- Różne metody płatności, takie jak Alipay, WeChat Pay, itp.
- Różne algorytmy sortowania, takie jak sortowanie bąbelkowe, quicksort, itp.
- Różne metody logowania, takie jak wyjście do konsoli, wyjście do pliku, itp.
4. Implementacja wzorca strategii w języku Golang
W tej sekcji zaimplementujemy wzorzec strategii przy użyciu języka Golang i dostarczymy odpowiednie przykłady, diagramy klas UML oraz komentarze w kodzie.
4.1. Diagram klas UML
Poniżej znajduje się diagram klas UML dla wzorca strategii w języku Golang:
4.2. Wprowadzenie przykładu
Z powyższego diagramu klas UML wynika, że wzorzec strategii składa się z trzech elementów: interfejsu Strategy
, konkretnych klas strategii (np. ConcreteStrategyA
i ConcreteStrategyB
) oraz klasy kontekstu Context
.
W tym przykładzie będziemy wykorzystywać wybór metod płatności dla zamówień w systemie e-commerce. Klient wybiera odpowiednią strategię (ConcreteStrategyA
lub ConcreteStrategyB
) na podstawie metody płatności, a następnie wywołuje metodę klasy kontekstu w celu dokonania płatności.
4.3. Krok 1 implementacji: Definicja interfejsu strategii i konkretnych klas strategii
Najpierw musimy zdefiniować interfejs strategii Strategy
, który zawiera metodę Execute(data interface{}) string
do wykonania określonej strategii.
type Strategy interface {
Execute(data interface{}) string
}
type ConcreteStrategyA struct{}
func (s *ConcreteStrategyA) Execute(data interface{}) string {
// Logika wykonania konkretnej strategii A
}
type ConcreteStrategyB struct{}
func (s *ConcreteStrategyB) Execute(data interface{}) string {
// Logika wykonania konkretnej strategii B
}
4.4. Krok 2 implementacji: Implementacja klasy kontekstu
Następnie musimy zaimplementować klasę Context
, która pakuje określony obiekt strategii i dostarcza metodę SetStrategy(strategy Strategy)
do ustawienia obiektu strategii oraz metodę ExecuteStrategy(data interface{}) string
do wykonania określonej strategii.
type Context struct {
strategy Strategy
}
func (c *Context) SetStrategy(strategy Strategy) {
c.strategy = strategy
}
func (c *Context) ExecuteStrategy(data interface{}) string {
if c.strategy == nil {
// Domyślna logika wykonania strategii
} else {
return c.strategy.Execute(data)
}
}
4.5. Krok 3 implementacji: Korzystanie z wzorca strategii do realizacji rzeczywistej logiki biznesowej
Wreszcie możemy wykorzystać wzorzec strategii w kliencie do wykonania rzeczywistej logiki biznesowej.
func main() {
context := &Context{}
// Ustaw konkretną strategię A za pomocą metody SetStrategy
context.SetStrategy(&ConcreteStrategyA{})
result := context.ExecuteStrategy("Płatność Alipay")
// Ustaw konkretną strategię B za pomocą metody SetStrategy
context.SetStrategy(&ConcreteStrategyB{})
result = context.ExecuteStrategy("Płatność WeChat")
}
Podsumowanie
Z powyższego przykładowego kodu dowiedzieliśmy się, jak zaimplementować wzorzec strategii w języku Golang. Wzorzec strategii może pomóc nam wybierać różne algorytmy lub zachowania w zależności od różnych sytuacji oraz zapewnia lepszy sposób organizowania kodu, co sprawia, że jest on bardziej czytelny i łatwiejszy do utrzymania. W praktyce stosowanie wzorca strategii może skutecznie poprawić skalowalność i łatwość utrzymania kodu.