ホームページ >Java >&#&チュートリアル >Javaのアダプターパターン(Adapter)とは何ですか?アダプターパターン(詳細説明)

Javaのアダプターパターン(Adapter)とは何ですか?アダプターパターン(詳細説明)

青灯夜游
青灯夜游転載
2018-10-18 16:14:198388ブラウズ

この記事では、Java のアダプター モード (アダプター) とは何なのかを説明します。アダプターのパターン (詳細な説明)。困っている友人は参考にしていただければ幸いです。

目的: クライアント (クライアント) のニーズを満たすために、ソース タイプをターゲット タイプに適合させます。ここでは、ターゲット インターフェイスの呼び出し元をクライアントと見なします。

#使用シナリオ: 型をソース型からターゲット型に変換する必要があるシナリオ

前提条件 #:既存のクライアント

//Client 一个调用目标接口的方法
Class ClientInvoking {

    static void invoke(TargetInterface target) {
        String value = target.getMark();
        System.out.println(value);
    }

}

一般的に使用されるいくつかのモード

#モード 1:ターゲット インターフェイスがあり、既存のメソッドが存在します。

//目标接口
public interface TargetInterface {
    
    public String getMark();

    public String getInfo();

}
//已有类及方法
public class ExistClass {

    public String sayHello() {
        return "Hello";
    }
      
    public String sayWorld() {
        return "World";
    }
}
ExistClass によって返された文字列は、クライアントが使用する必要があるものであると想定しますが、クライアントが必要とする文字列はオブジェクトを通じて取得されます。 TargetInterface タイプなので、クライアントのニーズを満たすように既存のクラスを適応させる方法を見つける必要があります。このモードには 2 つのアプリケーション ソリューションがあります。

ソリューション 1. クラス アダプターmode

//适配器
public class ClassAdapter extends ExistClass implements TargetInterface {
    
    public int getMark() {
        String value = this.sayHello();
        return value;
    }
    
    public int getInfo() {
        String value = this.sayWorld();
        return value;
    }
    
}
//客户端调用
TargetInterface target = new ClassAdapter();
ClientInvoking.invoke(target);

Java インターフェースの概念から、TargetInterface の実装クラスとしての ClassAdapter は、クライアントのニーズに適応するために TargetInterface 型に上方変換できることがわかります。

オプション 2. オブジェクト アダプター パターン

//适配器
public class ClassAdapter implements TargetInterface {
    
    private ExistClass exist;
    
    public ClassAdapter(ExistClass existClass) {
        this.exist = existClass;
    }
    
    public int getMark() {
        String value = exist.sayHello();
        return value;
    }
    
    public int getInfo() {
        String value = exist.sayWorld();
        return value;
    }
    
}
//客户端调用
TargetInterface target = new ClassAdapter(new ExistClass());
ClientInvoking.invoke(target);
このソリューションは、継承を使用せず、より柔軟でスケーラブルなオブジェクトの保持方法。

モード 2: ターゲット インターフェイスはありませんが、ターゲット クラスは存在し、既存のメソッドは存在します。

まずは前提条件を確認しましょうクライアントは次のように変更されます。

Class ClientInvoking {

    static void invoke(TargetClass target) {
        String value = target.getMark();
        System.out.println(value);
    }

}
変換後、invoke メソッドはパラメータとして TargetClass クラスのオブジェクトを必要とします。ターゲット クラスと既存のクラスは次のとおりです。
//目标类
public class Class {
    
    public String getMark() {
        return "yes";
    }

    public String getInfo() {
        return "no";
    }

}
//已有类及方法
public class ExistClass {

    public String sayHello() {
        return "Hello";
    }
      
    public String sayWorld() {
        return "World";
    }
}

ExistClass によって返された文字列がまさにクライアントが使用する必要があるものであると想定しており、クライアントが必要とする TargetClass オブジェクトのコンテンツは古いため、ある方法で ExistClass を適応させる必要があります。クライアントのニーズに合わせて;

//适配器
public class ClassAdapter extends TargetClass {
    
    private ExistClass exist;
    
    public ClassAdapter(ExistClass existClass) {
        this.exist = existClass;
    }
    
    public int getMark() {
        String value = exist.sayHello();
        return value;
    }
    
    public int getInfo() {
        String value = exist.sayWorld();
        return value;
    }
    
}
//客户端调用
TargetClass target = new ClassAdapter(new ExistClass());
ClientInvoking.invoke(target);

このモードでは、2 つのクラスが設計され、最後に Java の単一継承メカニズムに従って、必要となるのは次のとおりです。フォーム、オブジェクト アダプター パターンを通じてオブジェクトを保持します。

モード 3: デフォルトのアダプター モード

このモードでは、明示的なターゲット タイプはなく、ソース タイプのみが必要です。これを使用するには、多くの場合、ソース タイプが必要のないものを提供しすぎており、アダプター モードを通じてカスタマイズする必要があるためです。 WindowListener を例として説明します。

//WindowListener源码
public interface WindowListener extends EventListener {
    public void windowOpened(WindowEvent e);
    public void windowClosing(WindowEvent e);
    public void windowClosed(WindowEvent e);
    ...
}
//添加监听器的例子
Frame frame = new Frame();
frame.addWindowListener(new WindowListener() {
    @Override    
    public void windowOpened(WindowEvent e) {
            
    }

    @Override    
    public void windowClosing(WindowEvent e) {

    }

    @Override    
    public void windowClosed(WindowEvent e) {

    }
    ...
})

このようなコードは非常に面倒に思えます。たとえば、終了イベントをリッスンするだけで済みますが、大量のテンプレート コードが生成されます。コードの可読性が低下することを考慮して、コードをカスタマイズし、実装するインターフェイスを 1 つだけ用意します。インターフェイスを作成し、空の実装をすべてのリスナーに提供します。その後、抽象クラスのサブクラスを使用して、ウィンドウを閉じるリスナーの実装を書き換えます。コードは次のとおりです。 #この方法により、インターフェイスが簡素化され、コードの読みやすさが向上します。最も重要なことは、インターフェイスのカスタマイズを実現し、必要なことだけを実行できるようになったということです。

要約: 以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。関連チュートリアルの詳細については、Java ビデオ チュートリアル

Java 開発グラフィック チュートリアルブートストラップ ビデオ チュートリアル

をご覧ください。

以上がJavaのアダプターパターン(Adapter)とは何ですか?アダプターパターン(詳細説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。