デザインパターン07 ブリッジモード

ブリッジパターンは構造パターンです

概要

ブリッジ パターンでは、抽象部分を実装部分から分離し、独立して変更できるようにします。これはオブジェクト構造パターンであり、ハンドルとボディ パターンまたはインターフェイスパターンとも呼ばれます。

たとえば、コンピューター オブジェクトを作成する必要がある場合、市場には多数のコンピューターがあり、ブランドには Huawei、Apple、Lenovo などが含まれ、タイプにはデスクトップ、ノートブック、タブレットなどがあります。各ブランドのコンピューターの種類ごとにオブジェクトを作成すると、拡張するのが非常に面倒で不便になります。ブランドタイプを追加すると、多数のオブジェクトを追加する必要があることを想像してみてください。これは間違いなく面倒で非効率です。

このとき、ブランドタイプのディメンションをそれぞれ設定し、これら 2 つのディメンションを結合するとオブジェクトが得られると考えます。このように、すべてのブランドとすべてのタイプを定義するだけで済みます。追加するには、ブランドまたはタイプを追加するだけです

コード

以下では、ブリッジ モードを実装するためのブランドとして Huawei と Apple、タイプの例としてデスクトップとラップトップを使用しています。

1. ブランドを定義する

/**
 * 品牌
 */
public interface Brand {
    
    

    /**
     * 名称
     */
    String name();

}

2. コンピュータを定義する

/**
 * 电脑
 */
public abstract class Computer {
    
    

    /**
     * 品牌
     * <p>因为需要提供继承类使用,这里定义为 protected
     */
    protected Brand brand;
    
    public Computer(Brand brand) {
    
    
        this.brand = brand;
    }

    /**
     * 获取电脑名称,留给子类实现
     */
    public abstract String name();
}

3. 特定のブランドを定義する

/**
 * 华为
 */
public class HuaWei implements Brand {
    
    
    
    @Override
    public String name() {
    
    
        return "华为";
    }
}
/**
 * 苹果
 */
public class Apple implements Brand {
    
    
    
    @Override
    public String name() {
    
    
        return "苹果";
    }
}

4. タイプを定義する

/**
 * 台式
 */
public class Desktop extends Computer {
    
    

    public Desktop(Brand brand) {
    
    
        super(brand);
    }

    @Override
    public String name() {
    
    
        return super.brand.name() + "台式";
    }
}
/**
 * 笔记本
 */
public class Laptop extends Computer {
    
    

    public Laptop(Brand brand) {
    
    
        super(brand);
    }

    @Override
    public String name() {
    
    
        return super.brand.name() + "笔记本";
    }
}

5. 電話をかける

// 苹果笔记本
Computer computer = new Laptop(new Apple());
System.out.println(computer.name());

// 华为台式机
Computer computer1 = new Desktop(new HuaWei());
System.out.println(computer1.name());

出力は次のとおりです。

苹果笔记本
华为台式

これにより、ブランドタイプの橋渡しが実現します。このようにして、ブランドを追加する必要がある場合は、 Brand インターフェイスを実装するクラスを追加するだけで済み、型を追加する必要がある場合は、 Computer クラスを継承するクラスを追加するだけで済みます。

長所と短所

アドバンテージ

1. ブリッジ モードは多重継承ソリューションに似ている場合がありますが、多重継承ソリューションはクラスの単一責任の原則に違反し、再利用性が低く、クラスの数が多いため、ブリッジ モードは多重継承ソリューションよりも優れたソリューションです。継承ソリューション。サブクラスの数が大幅に削減されるため、管理およびメンテナンスのコストが削減されます。

2. ブリッジモードによりシステムの拡張性が向上し、元のシステムを変更することなく、変化する2つの次元のうち一方を任意に拡張できます。開閉の原理に沿って、変化する 2 つの次元をつなぐ橋のようなものです。

3. 抽象化と実装の分離。

4. 優れた拡張性。

5. 実装の詳細を顧客に透過的にします。

欠点がある

1. ブリッジモードの導入によりシステムの理解・設計の難易度が高まり、抽象層で集約関係が構築されるため、開発者は抽象化に基づいた設計・プログラミングが必要となります。

2. ブリッジ モードでは、システム内で独立して変化する 2 つの次元を正確に識別する必要があるため、その使用範囲には一定の制限があります。

使用するシーン

1. システムが、構築された抽象ロールと特定のロールの間の柔軟性をさらに高め、2 つのレベル間の静的な継承関係の確立を回避する必要がある場合、ブリッジ モードを通じて抽象層で関連付け関係を確立できます。抽象ロールと具象ロールは、相互に影響を与えることなく継承により独立して拡張できます プログラムの実行中に、抽象サブクラスのオブジェクトと具象クラスのオブジェクトを動的に組み合わせることができます つまり、システムは抽象を動的に組み合わせる必要があります役割と具体的な役割、カップリング。

2. クラスには 2 つの独立して変化する次元があり、両方の次元を拡張する必要があります。

3. システム内で継承を利用しても問題ありませんが、抽象的な役割と具体的な役割は独立して変更する必要があるため、独立して管理する設計が必要です。ブリッジ モードは、継承を使用したくないシステム、またはマルチレベルの継承によりシステム クラスの数が大幅に増加するシステムに特に適しています。

4. Java 言語は、Java 仮想マシンとオペレーティング システムの間のブリッジを通じてプラットフォームの独立性を実現します。

5. AWT のピア アーキテクチャ。

6. JDBC ドライバー。

予防

2 つの独立して変化する次元の場合、ブリッジ モードの使用が最適です。


参考

https://www.bilibili.com/video/BV1mc411h719?p=8&vd_source=299f4bc123b19e7d6f66fefd8f124a03

おすすめ

転載: blog.csdn.net/qq_37770674/article/details/132472722