somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【パターン】実装と機能をつなげる橋【Bridge】

Bridgeパターンのメモです。

Bridge

簡単に言うと、行いたいこと(機能)と実現方法(実装)を結びつけるためのパターンです。機能と実装を別々にして、それを結び付けます。

機能と実装を1つにした場合

機能と実装を別々にすると前述しました。別々にしないとどうなるのかを説明します。例として、引数として与えられた文字列を出力する機能を持ったクラスを作成します。別々にしない場合、このクラスに出力する機能が実装されます。

次にこの機能を拡張します。つまり、クラスが1つ増えます。さらにこの拡張したクラスを拡張する場合、どんどんクラスの階層が深くなっていきます。

階層を深くしないためには、がコピペでもして実装するしかありません。コピペが嫌ならクラスライブラリ化することで解決できますが、責任の場所が関係のないクラスに移ってしまうのはオブジェクト指向として問題だと思います。

機能と実装を別々にする

文字列を出力をする機能を引き続き例にします。この機能の実装を、別のクラスに実装するということです。どうやって機能を実現するかというと、機能のクラスが、実装のクラスを保持して使用します。機能のための実装クラスという責任を持っていますので、前述のコピペを防ぐためのクラスライブラリとは意味が違うと思います。

実装クラスの仕様とと実装を別々にする

色々参考にしていると、実装クラスを抽象クラスやインターフェースにして仕様(抽象メソッド)を定義しているものがほとんどでした。これのメリットは、ひとつの実装だけでなく、実装の切り替えを行えることだと思っています。機能で必要となる最低限の仕様が決まっていることで、実装を切り替えても実装を使用する機能側で困らないと思っています。

機能を拡張する

拡張した機能は実装されたものをベースに作っていくようです。ベースにしないとただ拡張しているだけになりますね。