Adapterパターンとは
Adapterとは英語で「adapt(適合)させるもの」を意味する。
プログラム上で既存のクラス等をそのまま再利用できない場合に、既存のものと必要なものの間を埋めるようなデザインパターン。別名Wrapperパターン。
実装は「継承を利用したパターン」「委譲を利用したパターン」の2通りあるが、Goでは継承が存在しないため委譲を利用したパターンを記載する。
Adapterパターンを利用することで下記のようなメリットを得ることができる。
- 利用する側が求めるインターフェースと異なっても、既存クラスをインターフェースを変更することなく再利用できる。
→十分にテストされバグの少ないクラスを再利用することで品質を確保できる。
必要な機能を持っているクラス(既存クラス)のことをAdaptee、Adaptee役のインターフェースを変換するクラスをAdapterと呼ぶ。
クラス図

実装
インターフェース
package main
type Print interface {
PrintWeak()
PrintStrong()
}
構造体
package main
import (
"fmt"
)
// Adaptee
type Banner struct {
str string
}
func NewBanner(str string) *Banner {
b := Banner{str: str}
return &b
}
func (b *Banner) ShowWithParen() {
fmt.Printf("(%s)\n", b.str)
}
func (b *Banner) ShowWithAster() {
fmt.Printf("*%s*\n", b.str)
}
package main
// Adapter
type PrintBanner struct {
banner Banner
}
func NewPrintBanner(str string) *PrintBanner {
b := NewBanner(str)
pb := PrintBanner{banner: *b}
return &pb
}
func (p PrintBanner) PrintWeak() {
p.banner.ShowWithParen()
}
func (p PrintBanner) PrintStrong() {
p.banner.ShowWithAster()
}
動作確認
package main
func main() {
p := NewPrintBanner("Hello")
// PrintインターフェースのPrintWeak, PrintStrongでそれぞれBannerのShowWithParen, ShowWithAsterを実行できている。
p.PrintWeak()
p.PrintStrong()
}
(Hello)
*Hello*
コメント