Ccmmutty logo
Commutty IT
3 min read

Adapter

https://cdn.magicode.io/media/notebox/5e1f63ae-e6e2-423f-8544-76fa385dae54.jpeg
Adapterパターンは、APIクライアントが必要とするインターフェースを持つラッパーを提供し、互換性のない型をリンクさせ、2つの型の間のトランスレーターとして機能します。 アダプターは、クラスのインターフェイスを使用して、互換性のある別のインターフェイスを持つクラスになります。要件が変更された場合、互換性のないインターフェースのためにクラスの機能を変更する必要があるシナリオがあります。
依存関係逆転の原則は、アダプターパターンを使用することで、クラスが自身のインターフェースをアダプタークラスが実装する次のレベルのモジュールのインターフェースに定義する場合に遵守することができます。委譲は、アダプターパターンで使用されるもう一つの原則です。ソースからデスティネーションへの変換を扱う複数のフォーマットは、アダプターパターンが適用されるシナリオです。 <=ここら辺よくわからない
Adapterパターンの構成
  • target
  • adaptee
  • adapter
  • client
  • ターゲットとは、クライアントがアダプタやアダプティのメソッドを呼び出すためのインターフェースです。
  • クライアントは、アダプタが実装する互換性のないインターフェースを求めます。
  • アダプタは、アダプティの互換性のないインタフェースを、クライアントが望むインタフェースに変換します。
例えば、processメソッドを持つIProcessインターフェイスがあり、Adapterクラスはprocessメソッドを実装し、Adapteeインスタンスを属性として持っているとします。Adaptee クラスは convert メソッドと adapterType インスタンス変数を持っています。APIクライアントを使用している開発者は、processインターフェース・メソッドを呼び出して、Adaptee上でconvertを呼び出します。コードは以下の通りです。
go
import ("fmt")

//Iprocess interface == Target
//インターフェイス定義は type インターフェイス名 interface {持っているメソッド}
type IProcess interface {
    process()
}
//Adapter struct
//クラス定義は type クラス名 struct {属性名 属性の型} で指定
type Adapter struct {
    adaptee Adaptee
}

//AdapterクラスはAdaptee.convert()を呼び出すprocessメソッドを持つ
//アダプタはアダプティの互換性のないインターフェイスを、クライアントが望むインターフェイスに変換する
//なるほどクラスメソッドは func (変数名 型<=レシーバー) method(parameter) (return) {処理} で書くっぽい
// This method means type Adapter implements the interface IProcess,
// but we don't need to explicitly declare that it does so.
func (adapter Adapter) process() {
    fmt.Println("Adapter process")
    adapter.adaptee.convert()
}
//Adaptee Struct
type Adaptee struct {
    adapterType int
}
//Adaptee 用のインターフェイス
func (adaptee Adaptee) convert() {
    fmt.Println("Adaptee convert method",adaptee.adapterType)
}
//main method
//クラスの呼び出しは クラス名{インスタンス変数}
func main() {
    //クライエントがアダプタが実装する互換性のないインターフェイスを求めている
    var processor IProcess = Adapter{Adaptee{3}}
    processor.process()
}
main()

Discussion

コメントにはログインが必要です。