アダプター設計パターンは、互換性のないインターフェースの連携を可能にする構造設計パターンです。これは 2 つのオブジェクト間のブリッジとして機能し、ソース コードを変更せずに相互作用できるようにします。このパターンは、新しいコンポーネントを統合する場合、またはアプリケーションが期待するものとは異なるインターフェイスを持つレガシー システムを操作する場合に特に役立ちます。
この投稿では、Java で実装された実際の例を使用して、アダプターの設計パターンを詳しく説明します。また、アダプター パターンを他の設計パターンと組み合わせて使用して、ソフトウェア アーキテクチャの柔軟性と拡張性をさらに高める方法についても説明します。
アダプターの設計パターンとは何ですか?
アダプター パターンを使用すると、あるインターフェイスをクライアントが期待する別のインターフェイスに変換できます。これは、互換性のないインターフェイスを持つクラスを統合するという問題を解決し、コードを変更せずにクラスを連携できるようにするのに役立ちます。
主要なコンポーネント:
- クライアント: インターフェースを使用する必要があるクラス。
- ターゲット: クライアントが期待するインターフェース。
- Adaptee: 互換性のないインターフェイスを持つクラス。
- Adapter: アダプティのインターフェースをターゲットインターフェースに変換するクラス。
アダプター パターンを使用すると、あるインターフェイスを別のインターフェイスに変換する アダプター として知られる中間クラスを作成することで、互換性のないインターフェイスを持つオブジェクトが連携できるようになります。
現実世界の例: メディア プレーヤー
.mp3、.mp4、.vlc など、さまざまな種類のメディア ファイルの再生をサポートする必要がある MediaPlayer アプリケーションを構築していると想像してください。各メディア タイプには独自のプレーヤーが付属していますが、インターフェイスには互換性がありません。これらの異なるプレーヤーを同じ MediaPlayer インターフェイスで連携して動作させる必要があります。
ステップ 1: MediaType 列挙型を定義する
まず、さまざまなメディア形式を表す列挙型 MediaType を定義します。これは、アプリケーションでメディア タイプを選択するときにタイプ セーフティを維持するのに役立ちます。
public enum MediaType { MP3, MP4, VLC }
ステップ 2: MediaPlayer インターフェイスを定義する
MediaPlayer インターフェイスは、メディア ファイルを再生するために予期されるメソッド play() を定義します。これは、クライアント (メイン アプリケーション) が期待するターゲット インターフェイスです。
// The Target Interface public interface MediaPlayer { void play(String fileName); }
ステップ 3: アダプティ クラスを定義する
次に、2 つのレガシー プレーヤー クラス、VlcPlayer と Mp4Player を定義します。これらのクラスには、.vlc および .mp4 ファイルを再生するための互換性のないメソッドがあり、MediaPlayer インターフェイスと一致しません。
public enum MediaType { MP3, MP4, VLC }
ステップ 4: アダプター クラスを作成する
次に、アダプター クラスを作成します。各アダプターは MediaPlayer インターフェイスを実装し、対応するプレーヤーのメソッドに play() メソッドを委譲します。
VlcPlayer 用アダプター:
// The Target Interface public interface MediaPlayer { void play(String fileName); }
Mp4Player 用アダプター:
// The Adaptee Class - VLC Player public class VlcPlayer { public void playVlc(String fileName) { System.out.println("Playing VLC file: " + fileName); } } // The Adaptee Class - MP4 Player public class Mp4Player { public void playMp4(String fileName) { System.out.println("Playing MP4 file: " + fileName); } }
ステップ 5: AudioPlayer (クライアント) を実装する
AudioPlayer クラスは、さまざまな形式でメディア ファイルを再生するクライアントです。 MediaPlayer インターフェイスの使用が想定されています。 AudioPlayer 内では、アダプターを使用して、さまざまなプレーヤー インターフェイスを期待される MediaPlayer インターフェイスに変換できます。
また、Map を使用して、MediaType に基づいて正しいアダプターを動的にロードします。
// Adapter for VLC Player public class VlcAdapter implements MediaPlayer { private VlcPlayer vlcPlayer; public VlcAdapter(VlcPlayer vlcPlayer) { this.vlcPlayer = vlcPlayer; } @Override public void play(String fileName) { vlcPlayer.playVlc(fileName); } }
ステップ 6: アダプター パターンの使用
これで、AudioPlayer を使用してさまざまな種類のメディア ファイルを再生できるようになりました。 MediaType を指定すると、AudioPlayer は指定されたメディア形式に適したアダプターを動的に選択します。
// Adapter for MP4 Player public class Mp4Adapter implements MediaPlayer { private Mp4Player mp4Player; public Mp4Adapter(Mp4Player mp4Player) { this.mp4Player = mp4Player; } @Override public void play(String fileName) { mp4Player.playMp4(fileName); } }
出力:
import java.util.HashMap; import java.util.Map; public class AudioPlayer { private Map<mediatype mediaplayer> mediaPlayerMap; public AudioPlayer() { mediaPlayerMap = new HashMap(); // Register adapters for each media type mediaPlayerMap.put(MediaType.VLC, new VlcAdapter(new VlcPlayer())); mediaPlayerMap.put(MediaType.MP4, new Mp4Adapter(new Mp4Player())); } public void play(MediaType mediaType, String fileName) { MediaPlayer mediaPlayer = mediaPlayerMap.get(mediaType); if (mediaPlayer != null) { mediaPlayer.play(fileName); // Delegate play to the appropriate adapter } else { System.out.println("Invalid media type: " + mediaType + ". Format not supported."); } } } </mediatype>
アダプター パターンを使用する利点
懸念事項の分離: アダプター パターンは、クライアント (AudioPlayer) をさまざまなメディア プレーヤーの特定の実装の詳細から分離します。アダプターは統合を処理し、クライアントが共通のインターフェースを使用できるようにします。
拡張性: クライアント コードを変更せずに、新しいアダプターを作成して AudioPlayer に登録することで、新しいメディア形式を簡単に追加できます。
コードの再利用性: VlcPlayer クラスと Mp4Player クラスは再利用可能で、内部コードを変更することなく、それらを必要とする他のシステムに統合できます。
スケーラビリティ: 新しい形式 (.avi、.flv など) が導入されると、新しいアダプターを追加することで、引き続きアダプター パターンを使用してそれらをシステムに統合できます。
アダプター パターンと他のパターンとの関係
アダプター パターンは、多くの場合、他の設計パターンと連携して動作し、システムの柔軟性と保守性を高めます。他のデザイン パターンとの関係は次のとおりです:
1. アダプターと戦略パターン
Strategy パターンを使用すると、アルゴリズムのファミリーを定義し、それらを交換可能にすることができます。 Adapter パターンは互換性のないインターフェースを連携させるために使用されますが、Strategy パターンは実行時に適切な動作 (または戦略) を選択することを目的としています。アダプター パターンは、ストラテジー インターフェイスに互換性がない場合に、ストラテジー パターンを使用するシステムで使用できます。
たとえば、メディア ファイルを処理するさまざまな方法 (さまざまな圧縮戦略など) がある場合、アダプター パターンを使用して、新しいメディア タイプをシステムの戦略と互換性のあるものにすることができます。
2. アダプターとデコレーターのパターン
Decorator パターンと Adapter パターンは両方とも、オブジェクトの動作を変更するために使用されます。主な違いは次のとおりです:
- アダプター: オブジェクトのインターフェイスを変更して、別のオブジェクトと互換性を持たせます。
- デコレーター: インターフェイスを変更せずに、オブジェクトに新しい機能を追加します。
アダプター パターンを使用して、サードパーティ クラスをシステムと互換性のあるものにし、その後、デコレーター パターンを使用して、その適応されたクラスに追加の機能 (ログや検証など) を追加できます。
3. アダプターとファサードのパターン
Facade パターンは、複雑なサブシステムへの簡素化されたインターフェイスを提供します。サブシステム内の一部のコンポーネントに互換性のないインターフェイスがある場合、ファサード内でアダプター パターンを使用して、サブシステムのすべての部分がファサードの統合インターフェイスと互換性があることを確認できます。
たとえば、複雑なビデオ処理サブシステムは、Facade を使用して簡素化できます。また、基礎となるビデオ プレーヤーに互換性のないインターフェイスがある場合は、アダプター パターンを使用してそれらを統合できます。ファサード。
4. アダプターとプロキシ パターン
プロキシ パターンは、別のオブジェクトのサロゲートまたはプレースホルダーを提供します。 Adapter パターンはオブジェクトのインターフェースを変更しますが、Proxy パターンはオブジェクトへのアクセスを制御し、遅延初期化、キャッシュ、アクセス制御などの動作を追加する可能性があります。
両方のパターンは、オブジェクトを目的のインターフェイスに適応させ、そのインターフェイスへのアクセスを制御するシナリオで一緒に使用できます。たとえば、アクセス制御に プロキシ を使用し、オブジェクトのインターフェイスをクライアントが期待する形式に変換するために アダプター を使用できます。
結論
アダプター設計パターンは、互換性のないインターフェイスを統合するための貴重なツールであり、レガシー コードやサードパーティ ライブラリを使用する場合に不可欠なパターンになります。アダプター パターンを使用すると、基礎となるコードを変更することなく、新しいコンポーネントまたはシステムが既存のシステムと対話できるようになります。
Adapter パターンは、柔軟性を高めるために、Strategy、Decorator、Facade、Proxy などの他のパターンと組み合わせて使用することもできます。アプリケーションのスケーラビリティも向上します。これにより、コードの柔軟性と保守性を維持できるため、既存のコードベースに大幅な変更を加えることなく、新しい要件に対応できるようにシステムを拡張できます。
さらに読む:
- デザイン パターン: 再利用可能なオブジェクト指向ソフトウェアの要素 Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides 著
- ヘッド ファースト デザイン パターン by Eric Freeman、Elisabeth Robson
- リファクタリングの達人 - アダプター パターン
以上がアダプターの設計パターンを理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaremainsagoodlanguagedueToitscontinuousevolution androbustecosystem.1)lambdaexpressionsenhancecodereadability andenableFunctionalprogramming.2)streamsalowsolowsolfisitydataprocessing、特に特にlagedatasets.3)硬化系系統系系統系系統系系統

Javaisgreatduetoitsplatformindependence、robustoopsupport、extensiveLibraries、andstrongCommunity.1)PlatformentepenteviajvMallowsCodeTorunonVariousPlatforms.2)oopeatureSlikeEncapsulation、遺伝、およびポリモ系系統型皮下皮質皮下Rich

Javaの5つの主要な特徴は、多型、Lambda Expressions、StreamSapi、ジェネリック、例外処理です。 1。多型により、さまざまなクラスのオブジェクトを一般的なベースクラスのオブジェクトとして使用できます。 2。Lambda式は、コードをより簡潔にし、特にコレクションやストリームの処理に適しています。 3.ストリームサピは、大規模なデータセットを効率的に処理し、宣言操作をサポートします。 4.ジェネリックは、タイプの安全性と再利用性を提供し、型刻印中にタイプエラーがキャッチされます。 5.例外処理は、エラーをエレガントに処理し、信頼できるソフトウェアを作成するのに役立ちます。

java'stoputuressificlynificlytallysperformanceandscalability.1)object-oriented-principleslikepolymorphismenabledscalablecode.2)garbagecolectionAutomateMemorymarymanagemenateButcancausElatenceSuses.3)

JVMのコアコンポーネントには、クラスローダー、runtimedataarea、executionEngineが含まれます。 1)クラスローダーは、クラスとインターフェイスの読み込み、リンク、初期化を担当します。 2)runtimedataareaには、Methodarea、Heap、Stack、Pcregister、Nativemethodstackが含まれています。 3)ExecutionEngineは、Bytecodeの実行と最適化を担当する通訳、JitCompiler、GarbageCollectorで構成されています。

Java'ssafetyandsecurityarebolteredby:1)stronttyping、whathspreventype-relatederrors; 2)自動メモリ管理viagarbagececollection、3)サンドボクシング、分離コードフロムシェシシステム;

Javaoffersseveralkeyfeaturesthatenhancecodingskills:1)Object-orientedprogramingallowsmodelingreal-worldentities、explifiedBypolymorphism.2)例外ハンドリングプロビッドログスロルマニネーション

jvmisacrucialcomponentthaturunsjavacodebytrantingintiTomachine特異的インストラクション、パフォーマンス、セキュリティ、およびポータビリティに影響を与えます


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ドリームウィーバー CS6
ビジュアル Web 開発ツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、
