この記事では主にインターフェイスの分離の原理を紹介します。編集者はそれが非常に優れていると考えたので、参考として紹介します。エディターをフォローして見てみましょう
定義: クライアントは、必要のないインターフェースに依存すべきではありません。あるクラスの別のクラスへの依存は、最小のインターフェースに基づく必要があります。
問題の原因: クラス A はインターフェイス I を通じてクラス B に依存し、クラス C はインターフェイス I を通じてクラス D に依存します。インターフェイス I がクラス A とクラス B の最小インターフェイスでない場合、クラス B とクラス D はそれを実装する必要があります。メソッドは必要ありません。
解決策: 肥大化したインターフェイス I をいくつかの独立したインターフェイスに分割し、クラス A とクラス C がそれぞれ必要なインターフェイスとの依存関係を確立します。つまり、インターフェース分離の原理が採用されています。
インターフェイス分離の原則を説明する例:
(図 1 インターフェイス分離の原則に従わない設計)
この図の意味は次のとおりです: クラス A はメソッド 1、メソッド 2、メソッド 3 に依存します。インターフェイス I では、クラス B はクラス A への依存関係の実装です。クラス C は、インターフェイス I のメソッド 1、メソッド 4、およびメソッド 5 に依存します。クラス D は、クラス C への依存の実装です。クラスBとクラスDについては、どちらも未使用のメソッド(図中の赤文字で示したメソッド)がありますが、インタフェースIが実装されているため、これらの未使用メソッドも実装する必要があります。クラス図に慣れていない人は、プログラム コードを参照して理解することができます。コードは次のとおりです。
interface I { public void method1(); public void method2(); public void method3(); public void method4(); public void method5(); } class A{ public void depend1(I i){ i.method1(); } public void depend2(I i){ i.method2(); } public void depend3(I i){ i.method3(); } } class B implements I{ public void method1() { System.out.println("类B实现接口I的方法1"); } public void method2() { System.out.println("类B实现接口I的方法2"); } public void method3() { System.out.println("类B实现接口I的方法3"); } //对于类B来说,method4和method5不是必需的,但是由于接口A中有这两个方法, //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。 public void method4() {} public void method5() {} } class C{ public void depend1(I i){ i.method1(); } public void depend2(I i){ i.method4(); } public void depend3(I i){ i.method5(); } } class D implements I{ public void method1() { System.out.println("类D实现接口I的方法1"); } //对于类D来说,method2和method3不是必需的,但是由于接口A中有这两个方法, //所以在实现过程中即使这两个方法的方法体为空,也要将这两个没有作用的方法进行实现。 public void method2() {} public void method3() {} public void method4() { System.out.println("类D实现接口I的方法4"); } public void method5() { System.out.println("类D实现接口I的方法5"); } } public class Client{ public static void main(String[] args){ A a = new A(); a.depend1(new B()); a.depend2(new B()); a.depend3(new B()); C c = new C(); c.depend1(new D()); c.depend2(new D()); c.depend3(new D()); } }
(図 2 インターフェイス分離原則に従った設計)
interface I1 { public void method1(); } interface I2 { public void method2(); public void method3(); } interface I3 { public void method4(); public void method5(); } class A{ public void depend1(I1 i){ i.method1(); } public void depend2(I2 i){ i.method2(); } public void depend3(I2 i){ i.method3(); } } class B implements I1, I2{ public void method1() { System.out.println("类B实现接口I1的方法1"); } public void method2() { System.out.println("类B实现接口I2的方法2"); } public void method3() { System.out.println("类B实现接口I2的方法3"); } } class C{ public void depend1(I1 i){ i.method1(); } public void depend2(I3 i){ i.method4(); } public void depend3(I3 i){ i.method5(); } } class D implements I1, I3{ public void method1() { System.out.println("类D实现接口I1的方法1"); } public void method4() { System.out.println("类D实现接口I3的方法4"); } public void method5() { System.out.println("类D实现接口I3的方法5"); } }
以上がJavaにおけるインターフェース分離原理の説明例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。