Strategy — паттерн, позволяющий выбирать алгоритм в рантайме. В Go реализуется через интерфейсы или функции первого класса.
type Compressor interface {
Compress(data []byte) ([]byte, error)
}
type GzipCompressor struct{}
type ZstdCompressor struct{}
func Upload(data []byte, c Compressor) error {
compressed, _ := c.Compress(data)
return send(compressed)
}
Или проще — через функцию:
type CompressFunc func([]byte) ([]byte, error)
func Upload(data []byte, compress CompressFunc) error {
compressed, _ := compress(data)
return send(compressed)
}
В Go Strategy — самый естественный паттерн, потому что интерфейсы маленькие и реализуются неявно. По сути, каждый раз когда принимаешь интерфейс в функции — используешь Strategy.