デザインパターンについて1 (Bridgeパターン)
今回オブジェクト指向の勉強をするために題材としてデザインパターンを選択した。
デザインパターンとは、よく出会う問題とそれにうまく対処するための設計のパターンのことで、オブジェクト指向における再利用性についてよく考えられた構造を持っています。なのでデザインパターンを勉強すればオブジェクト指向が身につくはず!
進め方は、以下のサイトに書いてあるデザインパターンのサンプルコードを実装、自分でコードを追加、その構造を理解、どのような点で便利であるかを調べることにした。
http://www.ceres.dti.ne.jp/~kaga/frame.html
まずは、Bridgeパターンのサンプルコード、クラス図、出力を見てみることにした。
サンプルコード
出力
これらを見てみると、機能構造であるDisplayクラスがあり、表示の仕方を具体化しているDisplayImplクラスに委譲している。そして、Displayクラスを継承しているCountDisplayクラスでは指定回数だけ表示する機能を追加したクラス、DisplayImplクラスを継承しているStringDisplayImplクラスでは文字列を使って表示するというクラスになっています。つまり、機能のクラスと表示のさせ方のクラスに分かれていることがわかる。
使い方としては、Main以下のようにCountDisplayクラスの初期化時にStringDisplayImplクラスのインスタンスを引数として使う。すると、CountDisplayクラス内でStringDisplayImplクラスのメソッドを扱うことができる(コードの中では、openメソッドで使われているrawOpenメソッドなど)ようになる。そして、Main以下では、StringDisplayクラスの振る舞いは気にしなくていいので、CountDisplayクラスのインスタンスを扱うだけで、CountDisplayクラスの機能をStringDisplayクラスの表示のさせ方で使うことができるようになっている。
また、CountDisplayクラスであるd2とd3はmultiDisplayメソッドを使うことができるが、d1は使うことができない。(エラーになる)
なぜこのような構造になっているか理解を深めるために、以下のようにクラスを追加して実装してみた。
コード
出力
Main以下を見るとCountDisplayクラスとEmptyDisplayクラスを初期化するときに引数としてStringDisplayImplクラスやCharDisplayImplクラスを使っている。この組み合わせを変えることで、以下のような機能と表示のさせ方が異なる4種類のクラス(に近いもの)を作成できる。
4種類のクラス(に近いもの)のインスタンス
- d1は線で囲まれた表示のさせ方でmultiDisplayメソッドを使える。
- d2は()で囲まれた表示のさせ方でdeleteDisplaメソッドを使える。
- d3は()で囲まれた表示のさせ方でmultiDisplayメソッドを使える。
- d4は線で囲まれた表示のさせ方でdeleteDisplayメソッドを使える。
このように機能と表示のさせ方のクラスを分けることのメリットは、
- 機能と表示のさせ方の組み合わせの数だけ異なる種類のクラス(に近いもの)を扱うことができる。
- 機能を追加するだけで、全ての表示のさせ方に対応できる。(逆も対応できる)
- 複数の継承関係がある場合でも片方ずつ考えることができる。
ということがわかった。
今回は説明の仕方が難しかったなぁ。もう少し書き直すかもしれない。。。
次回は、Builderパターンについて調べてみます。