Адаптер (Adapter)
Паттерн Adapter относится к структурным паттернам уровня класса.
Часто в новом проекте разработчики хотят повторно использовать уже существующий код. Например, имеющиеся классы могут обладать нужной функциональностью и иметь при этом несовместимые интерфейсы. В таких случаях следует использовать паттерн Adapter.
Смысл работы этого паттерна в том, что если у вас есть класс и его интерфейс не совместим с кодом вашей системы, то что бы разрешить этот конфликт, мы не изменяем код этого класса, а пишем для него адаптер. Другими словами Adapter адаптирует существующий код к требуемому интерфейсу (является переходником).
Требуется для реализации:
- Интерфейс Target, описывающий целевой интерфейс (тот интерфейс с которым наша система хотела бы работать);
- Класс Adaptee, который наша система должна адаптировать под себя;
- Класс Adapter, адаптер реализующий целевой интерфейс.
[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Значение этого Типа и Интерфейс. Также в языке Go за место общепринятого наследования используется агрегирование и встраивание.
//adapter.go
// Package adapter is an example of the Adapter Pattern.
package adapter
// Target provides an interface with which the system should work.
type Target interface {
Request() string
}
// Adaptee implements system to be adapted.
type Adaptee struct {
}
// NewAdapter is the Adapter constructor.
func NewAdapter(adaptee *Adaptee) Target {
return &Adapter{adaptee}
}
// SpecificRequest implementation.
func (a *Adaptee) SpecificRequest() string {
return "Request"
}
// Adapter implements Target interface and is an adapter.
type Adapter struct {
*Adaptee
}
// Request is an adaptive method.
func (a *Adapter) Request() string {
return a.SpecificRequest()
}
//adapter_test.go
package adapter
import (
"testing"
)
func TestAdapter(t *testing.T) {
adapter := NewAdapter(&Adaptee{})
req := adapter.Request()
if req != "Request" {
t.Errorf("Expect volume to %s, but %s", "Request", req)
}
}