[Golang]Bridge パターンを学ぼう!~Version 2~

こんにちは。KOUKIです。

以前、Bridgeパターンについて記事を書きましたが、別パターンでも実装したので紹介します。

Bridgeパターン

Bridgeパターンは、機能と実装を分離して、それぞれ独立に拡張できるようにしたパターンです。

Printer APIを題材に、どのように実装するのか学んでいきましょう。

Printer API

Printer APIを実装しました。

PrinterAPIインターフェースが「機能」、PrinterImpl1構造体のPrintMessageが「実装」と考えてください。

PrinterImpl1は、PrinterAPIのPrintMessage機能をメソッドとして定義しているので、PrinterAPIインターフェースの要件を満たしています。

テストコード1

まだ実装は途中ですが、テストコードで動作確認をしましょう。

PrinterImpl1構造体をインスタンス化して、PrintMessage機能を呼び出します。

現状だと、このテストコードは失敗します。

実装の拡張

テストコードは失敗したままですが、実装の拡張を行います。

PrinterImpl2構造体を定義し、インターフェースの要件を満たすようにPrintMessageメソッドを実装しました。

ここで注目して欲しいのが、PrinterImpl2のパラーメーターです

PrinterImpl1と違って、PrinterImpl2ではio.Writerを所持しています。つまり、機能(インターフェース)を変更せずに、io出力処理を拡張できているのです。

テストコード2

PrinterImpl2も実装の途中ですが、テストコードを実装します。

TestWriter構造体を作成し、PrinterImpl2のパラメータとして渡せるようにWriteメソッドを実装しました。

テストコードでは、以下の2点をチェックしています。

  1. io.Writerを渡せているか
  2. PrintMessage機能のテスト

テストは失敗しますが、一応実行しましょう。

実装の拡張2

実装の拡張の別パターンも見てみましょう。

今度は、PrinterAPIをパラメータに持たせ、メッセージも同時にセットできるようにしました。

これも実装途中ですが、テストコードを実装して動作を確認しましょう。

テストコード3

テストコードを実装すると、機能の使い方がわかるという側面がありますよね。

NormalPrinter構造体のパラメータにPrinterImpl1およびPrinterImpl2をそれぞれ格納することで、おのおののPrint機能が使えてますね。

このテストも失敗しますが、テストコードを実行します。

実装の拡張3

NormalPrinterとパラメータは同じですが、以下の構造体を定義します。

テストコード4

今度は、passedMessaage変数にPrinterに渡す文字列を設定し、expectedMessage変数は期待した戻り値という役割にしました。

このテストも失敗します。

Test OK

途中だった処理を実装していきましょう。

TestPrintAPI1をOKにする

TestPrintAPI2をOKにする

TestNormalPrinter_PrintをOKにする

TestPacktPrinter_PrintをOKにする

おまけ: カバレッジ

coverage: 100.0% of statements」!

おわりに

インターフェースは奥が深いですね。Bridgeパターンでもインターフェースをフルに活用して柔軟なソフトウェアを実装できています。

インターフェースはこちらの記事が大人気なので、よかったら参考にしてください^^

それでは、また!

Go記事まとめ

デザインパターンまとめ

Go記事をまとめます。

ソースコード

bridge.go

bridge_test.go

コメントを残す