어댑터 패턴 🔌

어댑터 패턴은 구조적 디자인 패턴입니다. 2개 이상의 호환되지 않는 개체가 서로 인터페이스할 수 있습니다.

가장 먼저 생각나는 것은 아마도 인도 전화 충전기를 유럽 벽면 소켓에 맞출 수 있는 벽면 소켓용 어댑터일 것입니다! 😂 바로 어댑터입니다. 최종 결과가 균일한 API를 노출하도록 비균일 클래스 주위에 작성된 래퍼 클래스입니다.

이해하기 어려운 경우 다음 예가 도움이 될 것입니다.

This tutorial uses go. You can find the implementation here. However, if you read through it, I'm confident that you will be able to implement it in any programming language 🤗



번역기 예



귀하가 스페인으로 이주한지 얼마 되지 않은 일반 영어를 구사하는 사람이라고 생각해 보십시오. 🇪🇸
당신의 이웃은 보기 좋은 사람이고 당신은 이 사람과 친구가 되고 싶습니다. 그러나 한 가지 문제가 있습니다. 😨

이웃의 모든 사람들은 독점적으로 스페인어를 구사합니다. 아 역시 스페인어를 못하시네요 😞

잠재적인 친구와 의사 소통을 하려면 영어에서 스페인어로 연설을 변환하는 데 도움이 되는 일종의 번역기가 필요합니다. 프로그래밍 용어로 이 변환기는 우리가 어댑터라고 부르는 것입니다!

이것이 코드에서 어떻게 보이는지 이해합시다.

첫 번째 단계로, 일반 스페인어 사용자가 스페인어와 영어 사용자 모두에 대한 구조체와 함께 구현할 인터페이스를 만들어 보겠습니다.

type SpeakSpanish interface {
    greetInSpanish() string
}

// Notice that the SpanishSpeaker already implements the
// SpeakSpanish interface
type SpanishSpeaker struct {}

func (s *SpanishSpeaker) greetInSpanish() string {
    return "¡Hola!"
}

type EnglishSpeaker struct {}

func (e *EnglishSpeaker) greetInEnglish() string {
    return "Hello there!"
}

보시다시피 SpanishSpeaker는 이미 SpeakSpanish 인터페이스를 구현하고 있습니다. 그러나 EnglishSpeaker에는 greetInSpanish 기능이 없으므로 SpeakSpanish 인터페이스를 구현하지 않습니다.

어댑터 패턴을 사용하여 스페인어로 인사하는 기능을 제공하는 래퍼EnglishSpeaker를 작성해 보겠습니다.

type EnglishToSpanishAdapter {
    speaker EnglishSpeaker
}

func (a *EnglishToSpanishAdapter) greetInSpanish() string {
    const englishMessage = a.speaker.greetInEnglish();
    return translate(englishMessage)
}

func translate(engMessage string) spanishMessage string {
    // *insert complex translation logic*
    spanishMessage = "¡Hola!"
    return
}

어댑터를 자세히 관찰하면 구조체이고 greetInSpanish 메서드가 있으므로 SpeakSpanish 인터페이스를 구현한다는 것을 알 수 있습니다. 이 어댑터에 영어 스피커를 포장하면 기본적으로 스페인어 스피커를 얻을 수 있기 때문에 좋습니다.

또한 어댑터와 함께 util로 번역 기능이 있습니다. 일반적으로 Google 번역과 같은 일부 서비스를 사용하여 메시지를 번역합니다.

이제 어댑터 모듈이 완성되었습니다. 놀라운! 🔥🤘🏽

테스트해보고 동작을 봅시다.

func main() {
    espanol := SpanishSpeaker{}
    englishwoman := EnglishSpeaker{}

    fmt.Println("Without translation:")
    fmt.Println("Español says: ", espanol.greetInSpanish())
    fmt.Println("English Woman says: ", englishwoman.greetInEnglish())

    adaptedEnglishwoman := EnglishToSpanishAdapter{
        speaker: englishwoman,
    }

    fmt.Println("------------")
    fmt.Println("With translation:")
    fmt.Println("Español says: ", espanol.greetInSpanish())
    fmt.Println("English Woman says: ", adaptedEnglishwoman.greetInSpanish())
}

결과적으로 터미널에 다음과 같은 내용이 표시되어야 합니다.

Without translation:
Español says:  ¡Hola!
English Woman says:  Hello there
------------
With translation:
Español says:  ¡Hola!
English Woman says:  ¡Hola!

만세! 번역이 작동했습니다. 영국 여자와 스페인 친구가 이제 친구가 될 수 있습니다! 👩🏻‍🤝‍👨🏾

디자인 패턴으로 하루를 절약하세요 🚀😁

이 튜토리얼의 모든 코드는 this github repo에서 찾을 수 있습니다.

건배 ☕️

좋은 웹페이지 즐겨찾기