互換性のないモードの調整--アダプタモード(Adapter)


アダプタモードは、あるクラスのインタフェースをクライアントが望む別のインタフェース表現に変換し、インタフェースの不一致によるクラスの互換性の問題を解消することを目的とする.主に3種類に分けられます:クラスのアダプタモード、オブジェクトのアダプタモード、インタフェースのアダプタモード.
例えば、あなたの携帯電話は2.5 mmのインターフェースしかありません(Nokiaがやったようです)が、3.5 mmしか買えません.このとき、アダプタを買う必要があります(-.—||||
意図目的:既存のクラスが提供するサービスを保留し、顧客にインタフェースを提供し、顧客の期待を満たす.
いつ使用できますか:(1)既存のクラスを使用したいのですが、インタフェースはあなたのニーズに合っていません.2.5 mmはありません.(2)他の非関連クラスや予見不可能なクラス(つまり、インタフェースが必ずしも互換性がないクラス)と協働して動作する多重化可能なクラスを作成したい.(3)既存のサブクラスを使用したいが、インタフェースに一致するように各サブクラス化することはできない.オブジェクトアダプタは、親インタフェースに適しています.オブジェクトアダプタにのみ適用されます.
例を挙げると、例えば「源」は対人で、彼は2つの技能を持っていて、それぞれ日本語と英語を話すことですが、ある職場(目標)はあなたが同時に日本語、英語、フランス語を話す必要があります.よし、今私たちの任務は人という「源」を似合うこの職場の中で、どのように適応するかです.目標のニーズを満たすために、フランス語を話す方法を追加する必要があることは明らかです.
次にフランス語をどのように話すかという方法について議論します.なぜ「ソース」に直接メソッドを追加しないのかと言うかもしれませんが、私の理解では、ある目的を実現するためにソースクラスの一時的な方法を追加するのに適しているので、元のクラスの構造を破壊することはできません.同時にそうしないのもJavaの高集約、低結合の原理に合っている.直接加算できない以上、「ソース」自体の構造を破壊することなく、人間という「ソース」にメソッドを追加する方法をどのように実現するかについて説明します.
2クラスのアダプタモード
名前の通り、このようなアダプタモードは、主に、あるクラスのために単一で適切なモードを実現するために使用される.
ソースのコードは次のとおりです.
public class Person {  

    private String name;  
    private String sex;  
    private int age;  

    public void speakJapanese(){  
        System.out.println("I can speak Japanese!");  
    }  

    public void speakEnglish(){  
        System.out.println("I can speak English!");  
    }  
    ...//         get set   
}  

ターゲットインタフェースのコードは次のとおりです.
public interface Job {  

    public abstract void speakJapanese();  
    public abstract void speakEnglish();  
    public abstract void speakFrench();  

}  

アダプタのコードは次のとおりです.
public class Adapter extends Person implements Job{  

    public void speakFrench() {  

    }  

}  

明らかに、AdapterクラスはPersonクラスを継承していますが、Javaという単一の継承言語では、他のクラスを継承することはできません.つまり、このアダプタはPersonというクラスだけにサービスを提供しています.したがってクラス適合モードと呼ぶ.
3オブジェクトのアダプタモード
オブジェクトアダプタモードは、ソースをオブジェクトとしてアダプタクラスに集約します.
アダプタコードのみ貼り付け:
public class Adapter implements Job {  

    Person person;  

    public Adapter(Person person) {  
        this.person = person;  
    }  

    public void speakEnglish() {  
        person.speakEnglish();  
    }  

    public void speakJapanese() {  
        person.speakJapanese();  
    }  

    //new add 
    public void speakFrench() {  

    }  

}  

オブジェクトのアダプタモードで、「ソース」を構築パラメータとしてアダプタに入力し、インタフェースに必要なメソッドを実行します.このアダプティブモードは、複数のソースをアダプティブにすることができる.クラス適合モードの不足を補った.
2つのアダプティブモードを分析します.
(1)クラスの適合モードは単一ソースの適合に用いられ、そのソースの単一話のため、コード実現は選択論理を書く必要がなく、はっきりしている.オブジェクトのアダプティブモードはマルチソースのアダプティブに使用でき、クラスアダプティブモードの不足を補い、もともとクラスアダプターを多く書く必要があった場合は存在しない.弱点は、ソースの数が多いため、具体的な実現条件は分岐比が多く、はっきりしないことだ.
(2)アダプタモードは主にいくつかの場合に用いられる:(1)システムは既存のクラスを使用する必要があるが、既存のクラスは完全に需要に合致していない.(2)互いにあまり関連のないクラスを導入して,ある仕事を完成させる(オブジェクトの適合を指す).
4インタフェースのアダプタモード
最後に、デフォルトアダプタモードについてお話しします.このモードの核心は、1つのインタフェースを実現したいが、すべてのインタフェースメソッドを実現したくない場合、一部のメソッドを実現したい場合、デフォルトのアダプタモードを使用します.彼の方法は、インタフェースとボディ実装クラスに抽象クラスを追加することです.抽象クラスを空にしてターゲットインタフェースを実現するすべての方法.具体的な実装クラスは、完了する必要があるメソッドを上書きするだけでよい.コードは次のとおりです.
インタフェースクラス:
public interface Job {  

    public abstract void speakJapanese();  
    public abstract void speakEnglish();  
    public abstract void speakFrench();  
    public abstract void speakChinese();  

}  

抽象クラス:
public abstract class JobDefault implements Job{  

    public void speakChinese() {  

    }  

    public void speakEnglish() {  

    }  

    public void speakFrench() {  

    }  

    public void speakJapanese() {  

    }  

}  

実装クラス:
public class JobImpl extends JobDefault{  

    public void speakChinese(){  
        System.out.println("I can speak Chinese!");  
    }  

}  

まとめ:
  • クラスのアダプタモード:あるクラスを別の新しいインタフェースを満たすクラスに変換したい場合は、クラスのアダプタモードを使用して、新しいクラスを作成し、既存のクラスを継承し、新しいインタフェースを実現すればよい.
  • オブジェクトのアダプタモード:あるオブジェクトを別の新しいインタフェースを満たすオブジェクトに変換する場合は、元のクラスのインスタンスを持つWrapperクラスを作成し、Wrapperクラスのメソッドでインスタンスを呼び出すメソッドを作成できます.
  • インタフェースのアダプタモード:1つのインタフェースのすべてのメソッドを実装したくない場合は、抽象クラスWrapperを作成し、すべてのメソッドを実装し、他のクラスを書くときは、抽象クラスを継承すればよい.