依存性逆転の原則
依存性逆転のパターン(DIP)を達成するためにインターフェースが存在することは、オブジェクト指向プログラムにおいて他の設計上の制約をもたらす:
クラス内の全てのメンバー変数はインターフェース、もしくは抽象でなくてはならない。
全ての具象クラスパッケージはインターフェース、もしくは抽象クラスパッケージを通してのみ結合されなければならない。
具象クラスを派生してはならない。
既に実装済みのメソッドをオーバーライドしてはならない。
全ての変数のインスタンス化においてFactory MethodもしくはFactory パターン(英語版)のような生成に関するパターン(英語版)の実装が必要になる。もしくはDIフレームワークが必要になる。
UI とアプリケーションレイヤーパッケージは主に具象クラスを含んでいて、コントローラーは抽象/インターフェース型を含んでいる。また UI は ICustomerHandler のインスタンスを保持し、全てのパッケージは物理的に分離されていて。アプリケーションレイヤーには Page クラスが使用する具象クラスの実装が存在している。これらのインターフェースのインスタンスは (コントローラーと同じパッケージに存在するかもしれない)Factory によって動的に生成される。具象タイプである Page と CustomerHandler はお互いに依存してはらなず、両方とも ICustomerHandler に依存する。
これらの直接的な効果は、UI が直接 ApplicatonLayer や、ICustomerHandler を実装したどの具象パッケージも参照する必要がない事である。コンクリートクラスはリフレクションを使用してロードされる。またどの時点であっても、具象実装は UI クラスに変更を及ぼさずに他の具象実装に差し替える事ができる。他の興味深い可能性は Page クラスが ICustomerHander のメソッドに引数として渡す事ができるインターフェース IPageViewer を実装していると言う事で、これによってt具象実装は具象的な依存なしに UI と通信する事ができる。何故なら両者はインターフェースでリンクされているからである。