| 図中の分類 | 比較項目 | 特徴 |
| A.インタフェース継承の利用 | 解説 | インターフェースとなるクラスを継承してクラスに実装部分をおく。 |
| 長所 | 実装クラスを組み替えやすいため再利用性・拡張性に優れている。 |
| 短所 | インタフェースに新たなメソッドが必要とされる場合、実装クラスへの影響度がBよりも高くなることがある。特にインタフェースを継承する実装クラスが多くなると、仕様変更されたインタフェースに答えられない実装クラスをどうするかという問題を抱え込むこともある。 |
| 利用動機 | 再利用性や拡張性の可能性のある部分に採用する。ただし、インタフェースの仕様があまり変化しないものに適している。たとえば、フレームワークにおける利用者とのインタフェースに利用するなど、拡張の方向性や範囲を明確に定めた上での利用に適している。 |
| 実装方法 | Javaではabstractクラスとintafeceによる実現が可能であるが、intafaceを使った方がよい。なぜなら、intafaceを実装するクラスがスーパクラスを持つことができ、自由度が向上するからである。C++では純粋仮想関数で構成されたクラス(abstractクラス)が使われる。 |
| B.委譲の利用 | 解説 | インタフェースクラスが実装クラスを持ち、インタフェース処理を実装クラスに委譲(delegation)する。 |
| 長所 | インタフェースの仕様の変更に柔軟性がある。また、実装クラスをいくつも持ったり、異なるインタフェースと同一の実装クラスを持ったりする(図中の点線部分)ことができる。 |
| 短所 | 実装クラスとの関係をプログラムする必要があり、インタフェースのメソッドを明示的に実装クラスに委譲しなければならない。 |
| 利用動機 | インタフェースの拡張性に柔軟を持たせたい場合。たとえば、サブシステムのような大きな枠組みは仕様変更拡張によりインタフェース仕様が変化することが多い。他のサブシステムに提供するインタフェースをFacadeパターンの概念(第23章にて解説)を取り入れる場合に適している。 |
| 実装方法 | メッセージを委譲する実装クラスをインタフェースクラスが集約する。つまり実装クラスのインスタンスをnewして内部属性に保持しておき、メッセージが来たら、そのまま実装インスタンスに処理を伝搬する。 |