検索
ホームページJava&#&チュートリアルJava デザイン パターンのアダプター パターンとブリッジ パターンの概要 (コード例)

この記事では、Java デザイン パターンのアダプター モードとブリッジ モードについて説明します (コード例)。必要な方は参考にしていただければ幸いです。

はじめに

前の記事では、クリエイティブパターンのビルダーパターンとプロトタイプパターンについて学びました。今回はストラクチャーモードのアダプターモードとブリッジモードについて学びます。

アダプター パターン

概要

アダプター パターンは、互換性のない 2 つのインターフェイス間のブリッジとして機能します。このタイプのデザイン パターンは、2 つの独立したインターフェイスの機能を組み合わせた構造パターンです。

簡単に言うと、互換性のない 2 つのクラスは、一般にコンバーターとして知られるインターフェイスを通じて互換性が得られます。
生活における典型的な例は、電化製品の電圧です。アメリカの電圧は約 110V ですが、中国の電圧は一般的に 220V です。アメリカや日本の電化製品を使用したい場合は、110V に変換するコンバーターが必要です。 220Vまで。もう 1 つの典型的な例は、基本的にさまざまな携帯電話のバッテリーを充電できるユニバーサル充電器です。

ここでは、簡単な例を使用して説明します。
特定のビデオプレーヤーはMP4形式のビデオのみを再生できますが、MP4に加えて、主流のビデオ形式にはAVI、RVMBなども含まれます。現時点では、ビデオ形式を変換するために使用されるソフトウェアFormat Factoryがあります(アダプター)を使用してビデオを再生します。現時点では、アダプター パターンを使用してコードの記述を完了できます。

アダプター パターンには主に 2 つのタイプがあり、1 つは主に継承によってアダプター機能を実装するクラス アダプター パターンであり、もう 1 つは組み合わせによってアダプター機能を実装するオブジェクト アダプター パターンです。

最初はクラス アダプター パターンで、次の手順を完了する必要があります:

  1. MP4、AVI、RVMB ビデオ形式のインターフェイスを確立する

  2. MP4 ビデオ形式を実装するビデオ プレーヤー クラスを作成する。クラス;

  3. AVI、RVMB、およびその他の形式のビデオ ファイルを MP4 形式ファイルに変換するフォーマット ファクトリ クラスを作成します。

  4. これらのビデオを再生してください。

コードは次のとおりです:

コード例:

    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 をインストールするだけで済みます。

さて、これ以上ナンセンスではないので、例を使って説明しましょう。
鉛筆、黒ボールペン、赤ボールペンなど、たくさんの種類のペンが市販されています。また、試験用紙、新聞紙など、紙の種類もたくさんあります。一般的に、新聞の文字の色は黒ですが、試験用紙のマークの色は赤です。ペンと紙は独立していますが、紙に書くことでブリッジモードを使用できます。

实现步骤如下:

  1. 定义一个笔类的接口,有写的这个方法;

  2. 定义红笔和黑笔的类,实现笔类的接口;

  3. 定义一个纸类的抽象类,设置笔的种类,并需要实现被写的方法;

  4. 定义卷子纸和新闻纸类,继承纸类并实现该方法;

  5. 进行书写。

代码示例

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设计模式中建造者模式和原型模式的介绍(代码示例)

Java设计模式中工厂模式的介绍(代码示例)

以上がJava デザイン パターンのアダプター パターンとブリッジ パターンの概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Javaアプリケーションでプラットフォーム固有の問題を緩和するためのいくつかの戦略は何ですか?Javaアプリケーションでプラットフォーム固有の問題を緩和するためのいくつかの戦略は何ですか?May 01, 2025 am 12:20 AM

Javaはプラットフォーム固有の問題をどのように軽減しますか? Javaは、JVMおよび標準ライブラリを通じてプラットフォームに依存します。 1)bytecodeとjvmを使用して、オペレーティングシステムの違いを抽象化します。 2)標準のライブラリは、パスクラス処理ファイルパス、CHARSETクラス処理文字エンコードなど、クロスプラットフォームAPIを提供します。 3)最適化とデバッグのために、実際のプロジェクトで構成ファイルとマルチプラットフォームテストを使用します。

Javaのプラットフォームの独立性とマイクロサービスアーキテクチャの関係は何ですか?Javaのプラットフォームの独立性とマイクロサービスアーキテクチャの関係は何ですか?May 01, 2025 am 12:16 AM

java'splatformentencentenhancesmicroservicesecturectureby byofferingdeploymentflexability、一貫性、スケーラビリティ、およびポート可能性。1)展開の展開の展開は、AllosmicRoserviThajvm.2)deploymentflexibility lowsmicroserviceSjvm.2)一貫性のあるAcrossServicessimplisimpligiessdevelisementand

GraalvmはJavaのプラットフォーム独立目標とどのように関係していますか?GraalvmはJavaのプラットフォーム独立目標とどのように関係していますか?May 01, 2025 am 12:14 AM

Graalvmは、Javaのプラットフォームの独立性を3つの方法で強化します。1。言語間の相互運用性、Javaが他の言語とシームレスに相互運用できるようにします。 2。独立したランタイム環境、graalvmnativeimageを介してJavaプログラムをローカル実行可能ファイルにコンパイルします。 3.パフォーマンスの最適化、Graalコンパイラは、Javaプログラムのパフォーマンスと一貫性を改善するための効率的なマシンコードを生成します。

プラットフォームの互換性についてJavaアプリケーションをどのようにテストしますか?プラットフォームの互換性についてJavaアプリケーションをどのようにテストしますか?May 01, 2025 am 12:09 AM

aeffectivelytestjavaapplicationsforformcompativity、followthesesteps:1)setupautomatedacrossmultipleplatformsusingsingcitoolslikejenkinsorgithubactions.2)divivisonmanualtingonrealhardwaretocatissusuessususus.3)

プラットフォームの独立性を達成する上でのJavaコンパイラ(Javac)の役割は何ですか?プラットフォームの独立性を達成する上でのJavaコンパイラ(Javac)の役割は何ですか?May 01, 2025 am 12:06 AM

Javaコンパイラは、ソースコードをプラットフォームに依存しないバイトコードに変換することにより、Javaのプラットフォームの独立性を実現し、JVMがインストールされた任意のオペレーティングシステムでJavaプログラムを実行できるようにします。

プラットフォームの独立性のためにネイティブコードを介してbytecodeを使用することの利点は何ですか?プラットフォームの独立性のためにネイティブコードを介してbytecodeを使用することの利点は何ですか?Apr 30, 2025 am 12:24 AM

bytecodeachievesplatformedentencedexedectedbyavirtualMachine(VM)、forexApplev.forexample、javabytecodecanrunrunrunnonydevicewithajvm、writeonce、runany "ferfuctionality.whilebytecodeOffersenhの可能性を承認します

Javaは本当に100%プラットフォームに依存していませんか?なぜまたはなぜですか?Javaは本当に100%プラットフォームに依存していませんか?なぜまたはなぜですか?Apr 30, 2025 am 12:18 AM

Javaは100%のプラットフォームの独立性を達成することはできませんが、そのプラットフォームの独立性はJVMとBytecodeを通じて実装され、コードが異なるプラットフォームで実行されるようにします。具体的な実装には、次のものが含まれます。1。bytecodeへのコンパイル。 2。JVMの解釈と実行。 3。標準ライブラリの一貫性。ただし、JVMの実装の違い、オペレーティングシステムとハードウェアの違い、およびサードパーティライブラリの互換性は、プラットフォームの独立性に影響を与える可能性があります。

Javaのプラットフォーム独立性は、コードの保守性をどのようにサポートしますか?Javaのプラットフォーム独立性は、コードの保守性をどのようにサポートしますか?Apr 30, 2025 am 12:15 AM

Javaは、「Write onse、Averywhere」を通じてプラットフォームの独立性を実現し、コードの保守性を向上させます。 2。メンテナンスコストが低いため、1つの変更のみが必要です。 3.チームのコラボレーション効率が高く、知識共有に便利です。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

SublimeText3 英語版

SublimeText3 英語版

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

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。