デザインパターン6つの原則(4) - インタフェース分掌の原則

インターフェイスの棲み分け原理


慣れていないJava開発者のためのインタフェースは、それはほとんどすべてのJavaプログラム、抽象同義で存在します。インターフェイスの棲み分け原理、インターフェースについての最初の話の前に言えば、インタフェースは、次の2つに分かれています。

实例接口(Object Interface): 在Java中声明一个类,然后用new关键字产生一个实例,是对一个类型的事物的描述,这就是一种接口。或许我们乍一看会有点懵,怎么和我们原来学习的接口不一样呢,其实我们这样想,我们都知道,在Java中有一个Class类,表示正在运行的类和接口,换句话说每一个正在运行时的类或接口都是Class类的对象,这是一种向上的抽象。接口是一种更为抽象的定义,类是一类相同事物的描述集合,那为什么不可以抽象为一个接口呢?

类接口(Class Interface): 这就是我们经常使用的用interface定义的接口

括弧、インターフェイスに記載された原則によって定義されたJavaインターフェイスのインターフェイス孤立インタフェースは狭義ではなく、より広範な概念、インタフェース、抽象エンティティクラスまたはクラスすることができます。


定義:

それはインターフェイスしないで、クライアントが依存すべきではない;他のクラスに依存したクラスは、最小のインターフェイスに基づいている必要があります。

問題の起源:

クラスAおよびBのインターフェイスのインターフェイスIが最小でない場合、私は依存インタフェースクラスを介してインターフェースBを介してI依存性クラスのクラス、C、Dは、クラスB及びDは、彼らが必要としない実現するための方法でなければなりません。

ソリューション:

別々のいくつかのインタフェース、クラスAとCに肥大化界面Iは、それぞれ、それらが必要インターフェイスの依存関係を確立します。これは、インターフェイスの分離の原則を使用して、あります。

例えば:

クラスI依存インターフェース方法1、方法2、方法3、クラスA及びBは、従属クラスによって実装されます。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());
    }
} 

私たちは、インタフェースは限りメソッドはインターフェースを表示されているとおり、あまりにも肥大化している場合に関係なく、その依存クラスの、参照は使用していない、実装クラスは明らかに良いデザインではありませんこれらのメソッドを実装する必要がありますすることができます。この設計は、インターフェイス分離の原則を遵守するように変更した場合、それがインターフェイスIを分割する必要があります ここでは、私は3つのインターフェースに分割元のインターフェースを持っています。

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");
    }
} 

肥大化したインターフェースを作成していない単一のインタフェースの確立、インターフェースを改良しようと、できるだけ少ないインタフェースのメソッド:インターフェース分離の原則がある意味。言い換えれば、我々はむしろ呼び出すためにそれに依存するすべてのクラスの非常に大規模なインターフェイスを構築しようとするよりも、クラスごとに専用のインターフェースを確立したいです。ここで、インタフェースは大三特定のインターフェイスに変更される例は、分離の原理によって使用されるインターフェースです。プログラミングでは、より少数の特定のインターフェイスに依存し、より柔軟な包括的インターフェイスに依存しています。インタフェースは、エキゾチックな変化の広がりを防止する柔軟性、および保守性を向上させることができる分散複数のインタフェースを定義することによって、「契約」の外部セットのために設計されています。

ここでは、多くの人が前に単一責任原則の原則に非常によく似絶縁インターフェースを感じるだろう、そうではありません。

まず、シングル責任原則は、デューティの主要な焦点であり、界面分離原理フォーカス分離インターフェースは異なり。

全体的なフレームワークを構築するためのプログラムのために、主に抽象化するため、およびインターフェースインターフェースインターフェース偏析原理主制約;第二に、インタフェースおよびメソッド続い原理は、主にクラスに制約された単一の責任は、それはプログラムの実装および詳細を目的としています。

インターフェイスの制約のインターフェイス分離の原則を使用する場合は、次の点に注意してくださいするには:

接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。

为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

適切でなければならない、インターフェイス分離の原則を使用して、インターフェイスのデザインが大きすぎたり小さすぎは良くありません。インタフェースの設計時間、正確にこの原則を実施するために考え、計画するだけでより多くの時間。

おすすめ

転載: www.cnblogs.com/jlutiger/p/11280646.html
おすすめ