Шаблон адаптера в GoLang
Добро пожаловать, энтузиасты программирования! Давайте отправимся в увлекательное путешествие, чтобы разгадать тайны шаблона проектирования адаптеров, особенно в контексте Go. Представьте себе такую картину: вы-заядлый турист в чужой стране, в новом телефоне аккумулятор на 1%, и так же, как вы вытащите зарядное устройство, вы понимаете, — ой-ей — то не укладывается в местных торговых точках. Лучше всего было бы иметь дорожный адаптер — удобное маленькое устройство, которое устраняет разрыв между вашим зарядным устройством и внешней розеткой.
При разработке программного обеспечения мы часто сталкиваемся с подобными проблемами. У нас могут быть компоненты или интерфейсы, которые напрямую не “подходят” друг к другу. Не бойтесь, потому что в таких ситуациях мы можем использовать адаптер (точно такой же, как этот дорожный адаптер) для решения этих проблем совместимости. В этом суть шаблона адаптера, который мы рассмотрим сегодня в разделе Программирование на Go.
Теперь, когда мы заинтересовали вас, давайте продолжим и разберемся с шаблоном адаптера в Go.
Предоставим вам простое пошаговое руководство по шаблону адаптера в Go
Шаг 1: Определите свои интерфейсы
Представьте, что у нас есть интерфейс MediaPlayer
с методом Play
...
type MediaPlayer interface {
Play(audioType string, fileName string) error
}
…и мы хотим представить новый, более шикарный AdvancedMediaPlayer
, который может воспроизводить как аудио-, так и видеофайлы.
type AdvancedMediaPlayer interface {
PlayVideo(fileName string) error
PlayAudio(fileName string) error
}
Шаг 2: Реализуйте AdvancedMediaPlayer
Для AdvancedMediaPlayer
мы создаем VLCPlayer
. Это модное новое устройство, которое мы не можем подключить напрямую к нашей старой системе.
type VLCPlayer struct{}
func (v *VLCPlayer) PlayVideo(fileName string) error {
fmt.Printf("Playing video file. Name: %s\n", fileName)
return nil
}
func (v *VLCPlayer) PlayAudio(fileName string) error {
fmt.Printf("Playing audio file. Name: %s\n", fileName)
return nil
}
Шаг 3: Создайте адаптер
Точно так же, как адаптер для путешествий, мы теперь делаем MediaAdapter
. Он реализует интерфейс MediaPlayer
, но внутри использует AdvancedMediaPlayer
.
type MediaAdapter struct {
advancedMusicPlayer AdvancedMediaPlayer
}
func (m *MediaAdapter) Play(audioType string, fileName string) error {
if audioType == "vlc" {
return m.advancedMusicPlayer.PlayVideo(fileName)
} else if audioType == "mp4" {
return m.advancedMusicPlayer.PlayAudio(fileName)
}
return fmt.Errorf("invalid media. %s format not supported", audioType)
}
Наконец, давайте свяжем все вместе с нашим AudioPlayer
, который также реализует интерфейс MediaPlayer
. Он будет использовать наш MediaAdapter
для обработки новых типов мультимедиа.
type AudioPlayer struct {
mediaAdapter MediaPlayer
}
func (a *AudioPlayer) Play(audioType string, fileName string) error {
// Inbuilt support for mp3 music files
if audioType == "mp3" {
fmt.Printf("Playing mp3 file. Name: %s\n", fileName)
return nil
}
// MediaAdapter is providing support for other file formats
else if audioType == "vlc" || audioType == "mp4" {
a.mediaAdapter = &MediaAdapter{&VLCPlayer{}}
return a.mediaAdapter.Play(audioType, fileName)
}
return fmt.Errorf("invalid media. %s format not supported", audioType)
}
Последние мысли
И вот оно у нас есть! Используя шаблон адаптера, мы интегрировали наш новый VLCPlayer
в нашу систему без каких-либо проблем. Когда вы столкнетесь с несовместимыми интерфейсами, вспомните о дорожном адаптере и задействуйте шаблон адаптера. Речь идет о том, чтобы заставить вещи работать слаженно, несмотря на их различия. До следующего раза, включайте код и адаптируйтесь с апломбом!