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:

Wzorzec 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.