この記事では、Java デザイン パターンのアダプター モードとブリッジ モードについて説明します (コード例)。必要な方は参考にしていただければ幸いです。
前の記事では、クリエイティブパターンのビルダーパターンとプロトタイプパターンについて学びました。今回はストラクチャーモードのアダプターモードとブリッジモードについて学びます。
概要
アダプター パターンは、互換性のない 2 つのインターフェイス間のブリッジとして機能します。このタイプのデザイン パターンは、2 つの独立したインターフェイスの機能を組み合わせた構造パターンです。
簡単に言うと、互換性のない 2 つのクラスは、一般にコンバーターとして知られるインターフェイスを通じて互換性が得られます。
生活における典型的な例は、電化製品の電圧です。アメリカの電圧は約 110V ですが、中国の電圧は一般的に 220V です。アメリカや日本の電化製品を使用したい場合は、110V に変換するコンバーターが必要です。 220Vまで。もう 1 つの典型的な例は、基本的にさまざまな携帯電話のバッテリーを充電できるユニバーサル充電器です。
ここでは、簡単な例を使用して説明します。
特定のビデオプレーヤーはMP4形式のビデオのみを再生できますが、MP4に加えて、主流のビデオ形式にはAVI、RVMBなども含まれます。現時点では、ビデオ形式を変換するために使用されるソフトウェアFormat Factoryがあります(アダプター)を使用してビデオを再生します。現時点では、アダプター パターンを使用してコードの記述を完了できます。
アダプター パターンには主に 2 つのタイプがあり、1 つは主に継承によってアダプター機能を実装するクラス アダプター パターンであり、もう 1 つは組み合わせによってアダプター機能を実装するオブジェクト アダプター パターンです。
最初はクラス アダプター パターンで、次の手順を完了する必要があります:
MP4、AVI、RVMB ビデオ形式のインターフェイスを確立する
MP4 ビデオ形式を実装するビデオ プレーヤー クラスを作成する。クラス;
AVI、RVMB、およびその他の形式のビデオ ファイルを MP4 形式ファイルに変換するフォーマット ファクトリ クラスを作成します。
これらのビデオを再生してください。
コードは次のとおりです:
コード例:
interface Mp4{ void playMp4(); } interface Avi{ void playAvi(); } interface Rvmb{ void playRvmb(); } class VideoPlayer implements Mp4{ @Override public void playMp4() { System.out.println("播放Mp4格式的视频文件."); } } class FormatFactory extends VideoPlayer implements Avi{ @Override public void playAvi() { //转换成MP4格式的视频 playMp4(); } } public static void main(String[] args) { Mp4 mp4=new VideoPlayer(); mp4.playMp4(); Avi avi=new FormatFactory(); avi.playAvi(); }
実行結果:
播放Mp4格式的视频文件. 播放Mp4格式的视频文件.
上記のコードと実行結果を通じて、新しいビデオ形式がある場合に、目的の結果を得ることができます。 , このビデオ プレーヤーを使用して再生する必要がある場合は、インターフェイスとフォーマット ファクトリ クラスを追加するだけです。
オブジェクトアダプターパターン
は、組み合わせによってアダプター機能を実装します。
したがって、ここではオブジェクトを作成するためにフォーマットファクトリの継承を変更するだけで済みます。
変更後のコードは次のとおりです:
コード例
class FormatFactory2 implements Rvmb{ private Mp4 mp4; public FormatFactory2(Mp4 mp4) { this.mp4=mp4; } @Override public void playRvmb() { mp4.playMp4(); } } public static void main(String[] args) { Rvmb rvmb=new FormatFactory2(new VideoPlayer()); rvmb.playRvmb(); }
実行結果:
播放Mp4格式的视频文件.
両方のアダプターモードでこの機能が実装されていますが、クラスと比較してオブジェクトアダプターモードを使用することをお勧めします。アダプター パターン はより柔軟で、設計原則における合成と再利用の原則に準拠しています:
継承の代わりに合成/集約を使用するようにしてください。
アダプター パターンの利点:
クラスの再利用と柔軟性が向上します。
アダプターモードの欠点:
を使いすぎると、システムが複雑になり、使いこなすのが難しくなります。
注:
アダプターは詳細設計中に追加されるのではなく、サービス中のプロジェクトの問題を解決するために追加されます。
概要
ブリッジは、抽象化と実装を分離して、この 2 つを独立して変更できるようにするために使用されます。このタイプのデザイン パターンは構造パターンであり、抽象化と実装の間に橋渡し構造を提供することでそれらを切り離します。
文字通りの解釈は、真ん中の橋を介して両側のものを接続することですが、関連する2つのものは互いに影響しません。私が最も印象に残ったのは、<大话设计模式>
の携帯電話のブランドと携帯電話のソフトウェアです。携帯電話には多くのブランドがあり、それぞれの携帯電話にインストールされているソフトウェアも異なります。ソフトウェアは携帯電話の一部ではなく、集合関係です。ブランド A の携帯電話にはソフトウェア a と b がインストールされ、ブランド B の携帯電話にはソフトウェア b と c がインストールされている場合、ブランド A の携帯電話に新しいソフトウェア c をインストールする必要がある場合、方法を知らなくてもソフトウェアを追加するだけで済みます。ソフトウェアが作成されます。同様に、新しい C ブランドの携帯電話を追加する場合、必要なソフトウェア a、b、または c をインストールするだけで済みます。
さて、これ以上ナンセンスではないので、例を使って説明しましょう。
鉛筆、黒ボールペン、赤ボールペンなど、たくさんの種類のペンが市販されています。また、試験用紙、新聞紙など、紙の種類もたくさんあります。一般的に、新聞の文字の色は黒ですが、試験用紙のマークの色は赤です。ペンと紙は独立していますが、紙に書くことでブリッジモードを使用できます。
实现步骤如下:
定义一个笔类的接口,有写的这个方法;
定义红笔和黑笔的类,实现笔类的接口;
定义一个纸类的抽象类,设置笔的种类,并需要实现被写的方法;
定义卷子纸和新闻纸类,继承纸类并实现该方法;
进行书写。
代码示例
interface Pen{ void write(); } class RedPen implements Pen{ @Override public void write() { System.out.println("红色的字"); } } class BlackPen implements Pen{ @Override public void write() { System.out.println("黑色的字"); } } abstract class Paper{ protected Pen pen; void setPen(Pen pen){ this.pen=pen; } abstract void writing(); } class ExaminationPaper extends Paper{ @Override void writing() { pen.write(); } } class NewsPaper extends Paper{ @Override void writing() { pen.write(); } } public static void main(String[] args) { Paper paper=new ExaminationPaper(); paper.setPen(new RedPen()); paper.writing(); Paper paper2=new NewsPaper(); paper2.setPen(new BlackPen()); paper2.writing(); }
运行结果
红色的字 黑色的字
从上述结果中我们可以得出我们想要的结果。如果新增一个笔类或者一个纸类,那么只需新增相应的接口和实现即可,并不会因为结构化改变而相互直接影响。
桥接模式的优点:
1、抽象和实现的分离,实现了解耦;
2、提升的扩展能力。
桥接模式的缺点:
会使系统看起复杂,对新手不友好,没有一定的抽象进行设计能力难以理解。
使用场景:
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
相关推荐:
以上がJava デザイン パターンのアダプター パターンとブリッジ パターンの概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。