アダプター モード: インターフェイスの非互換性を修正するための 1 つのトリック

1. 概要

アダプター パターンは、クラスのインターフェイスをクライアントが期待する別のインターフェイスに変換できるようにする構造的な設計パターンで、互換性のないインターフェイスのために連携できなかったクラスが連携して機能できるようにします。平たく言えば、互換性のない 2 つのインターフェイスをアダプターを介して接続し、クライアントが共通のインターフェイスを呼び出すことで間接的に他の機能インターフェイスを呼び出すことができるようにすることです。イメージで例えると、アダプターは私たちの生活における 3 回充電用のデータ ケーブルのようなもので、さまざまな充電インターフェイスに適応できます。

1.1 それを達成するにはどうすればよいですか?

実際のケースで言うと、プレーヤーインターフェイス Player とその実装クラス MediaPlayer がありますが、現時点では機能が制限されており、MP3 オーディオ ファイルの再生のみが可能です。MP4 ビデオ ファイルの再生に使用される VideoPlayer インターフェイスとその実装 Mp4Player もありますが、このインターフェイスはクライアントが直接呼び出すことができません。Player で MP4 ビデオの再生をサポートしたい場合、どうすれば実現できますか?

アダプターモードの使用例新しい

この問題を解決するには、アダプタ モードを導入します。クライアントは引き続き Player インターフェイスを呼び出し、アダプタを通じてその呼び出しを VideoPlayer インターフェイスに転送して、MP4 を再生するという目的を達成します。

アダプターモード

1.2 利点

  • インターフェイスの非互換性の問題を解決する: アダプター パターンは、異なるクラス間のインターフェイスの非互換性の問題を解決できます。アダプターを介して、クライアントは既存のコードやオブジェクトを変更せずに、目的のインターフェイスを使用できます。
  • 既存のクラスの再利用: アダプター パターンは、コードを変更せずに既存のクラスを再利用できます。アダプターを使用すると、既存のクラスを新しいインターフェースに合わせてラップできます。
  • クラスの透明性を高める: アダプター パターンにより、クライアントは適応されたクラスの特定の実装の詳細に注意を払う必要がなく、アダプターを介してクラスと対話するだけで済みます。
  • 柔軟性と拡張性: アダプター パターンは、既存のコードに影響を与えることなく新しいアダプター クラスを追加できるため、新しいインターフェイスへの適応を実現し、システムの柔軟性と拡張性が向上します。

1.3 欠点

  • システムの構造の複雑さの増加: アダプターが過剰になると、新しいクラスやオブジェクトを導入する必要があるため、コードが乱雑になり、保守が困難になる可能性があります。
  • パフォーマンスの低下を引き起こす可能性がある: アダプター パターンでは、インターフェイスの変換時に追加の処理と変換が必要になるため、追加のパフォーマンスの低下が発生する可能性があります。アダプター パターンは、パフォーマンス重視のシステムでは注意して使用する必要があります。

1.4 適用可能なシナリオ

  • 既存のクラスまたはインターフェイスを使用する必要があるが、そのインターフェイスが既存のシステムのインターフェイスと互換性がない場合、アダプター パターンを使用して古いインターフェイスと新しいインターフェイスを調整し、連携できるようにすることができます。
  • システム内に一貫性のないインターフェイスを持つ複数のクラスまたはコンポーネントがあり、統合インターフェイスを外部に提供する必要がある場合、アダプター モードを使用して、さまざまなインターフェイスをクライアントが使用できる統合インターフェイスに変換できます。
  • サードパーティのライブラリまたはコンポーネントを独自のシステムに統合する必要があるが、そのインターフェイスが自分のシステムと一致しない場合、アダプタ モードを使用して、サードパーティ ライブラリのインターフェイスを独自のインターフェイスに変換できます。システム。

2. コードの実装

ステップ 1 : VideoPlayer インターフェイスと Mp4Player の実装

public interface VideoPlayer {
    
    
    void playVideo(String filename);
}
public class Mp4Player implements VideoPlayer {
    
    
    @Override
    public void playVideo(String filename) {
    
    
        System.out.println("播放MP4视频:"+filename);
    }
}

ステップ 2 : 共通インターフェースプレーヤー

public interface Player {
    
    
    void play(String filename);
	
    //接口中的默认方法,用于返回文件格式
    default String getFileType(String filename){
    
    
        if(filename.endsWith(".mp3")){
    
    
            return "mp3";
        }else if(filename.endsWith(".mp4")){
    
    
            return "mp4";
        }else{
    
    
            return "unknown";
        }
    }
}

ステップ 3 : アダプター MediaAdapter を追加する

public class MediaAdapter implements Player {
    
    
    VideoPlayer videoPlayer;

    public MediaAdapter(){
    
    
        videoPlayer=new Mp4Player();
    }

    @Override
    public void play(String filename) {
    
    
        videoPlayer.playVideo(filename);
    }
}

ステップ 4 : メディア プレーヤー MediaPlayer ----MP4 形式と互換性のあるアダプターを使用する

public class MediaPlayer implements Player {
    
    

    MediaAdapter mediaAdapter;

    @Override
    public void play(String filename) {
    
    
        if("mp3".equals(getFileType(filename))){
    
    
            System.out.println("播放MP3音频:"+filename);
        }else if("mp4".equals(getFileType(filename))){
    
    
            mediaAdapter =new MediaAdapter();
            mediaAdapter.play(filename);
        }else{
    
    
            System.out.println("Invalid media :format not supported");
        }
    }
}

ステップ 5 : クライアントのテスト

public  class Client {
    
    
    public static void main(String[] args) {
    
    
        Player play=new MediaPlayer();
        play.play("aaa.mp3");
        play.play("bbb.mp4");
        play.play("ccc.avi");
    }
}

試験結果

画像-20230524080416656

3. まとめ

この記事では、アダプタ モードについて詳しく紹介し、簡単なケースを通してアダプタ モードの原理と応用を簡単に理解することができます。アダプター モードは、インターフェイスの非互換性、システムの拡張、複数のインターフェイスの統合などの問題を解決し、コードの再利用性と柔軟性を向上させることができます。ただし、システムの複雑さが増し、パフォーマンスの低下が生じる可能性もあります。アダプター パターンを使用する場合は、特定の状況に応じて長所と短所を比較検討し、コードの混乱を引き起こすアダプターの過度の使用を避ける必要があります。

この記事があなたの学習に役立つことを願っています。この記事が役に立ったと思われる場合は、惜しみなく褒めて共有してください。読んでいただきありがとうございます。また次回お会いしましょう!
1711edbd2bd444b1b647e09c2c3aff0d

おすすめ

転載: blog.csdn.net/qq_36756227/article/details/130839645