DevGang
Авторизоваться

Шаблон адаптера в 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 в нашу систему без каких-либо проблем. Когда вы столкнетесь с несовместимыми интерфейсами, вспомните о дорожном адаптере и задействуйте шаблон адаптера. Речь идет о том, чтобы заставить вещи работать слаженно, несмотря на их различия. До следующего раза, включайте код и адаптируйтесь с апломбом!

Источник:

#Golang #Design
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу