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

青灯夜游
リリース: 2018-10-18 16:14:19
転載
8376 人が閲覧しました

この記事では、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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート