デザインパターン---ブリッジパターン

1はじめに

人生では、車など、さまざまなものが複数の次元で変化しています。色の次元の変化、モデルの次元の変化、ブランドの次元の変化があります。さまざまな次元の変化を表す最も簡単な方法を設計する方法車はもう?ブリッジモードを使用できます。

2定義

ブリッジパターンは、抽象化を実装から分離するため、独立して変更できます。これは、継承関係ではなく構成関係で実装されるため、抽象化と実装の2つの可変次元間の結合が減少します。ブリッジモードは、継承関係を構成関係に変更することです。

個人的には、この定義は比較的抽象的なものだと理解しています(とにかく最初に読んだときは理解できませんでした)。はじめに例を続けると、車は非常に抽象的な製品であり、色とモデルは私たちは特定の車を設計しています。私たちが車を作るとき、私たちは実現されたモデルと色を取り、それを車に直接置いて車を形成します。

別の例として、ペン先が異なる3つのブラシと12種類のペイントがある場合、3 * 12種類の線を描くことができます。同じ効果を得るには、クレヨンに36が必要です。前面のブラシはブリッジモードです(異なる種類のペンは1次元の変化であり、異なる色のペイントは1次元の変化であり、2つの次元は互いに影響しません)。一方、背面のブラシは複数の継承です。 (ペンの種類と顔料が一緒にクレヨンに影響を与えます)。理解した後、それをコード記述に抽象化します。penクラスは、メソッドdraw()を持つ抽象クラスです。ブラシを使用する場合は、色を入力してから、drawメソッドを実行してこの色を描画する必要があります。

3構造は実現です

ブリッジモードには、主に次の役割が含まれます。

1.抽象化の役割:抽象クラスを定義し、実装されたオブジェクトへの参照を含めます。たとえば、車には色とモデルへの参照が含まれています。

2.実装者ロール:拡張抽象ロールによって呼び出される、実装されたロールのインターフェースを定義します。色を実装します。

3.具体的な実装者の役割:実装された役割のインターフェースの具体的な実装を提供します。赤、黄、白からお選びいただけます。

4.拡張抽象化(洗練された抽象化)ロール:抽象化されたロールのサブクラスであり、親クラスにビジネスメソッドを実装し、構成関係を通じて実装されたロールのビジネスメソッドを呼び出します。特定の車。

引用2からの画像

4長所と短所

 ブリッジモードの利点は次のとおりです。

  • 抽象化と実装の分離、強力なスケーラビリティ
  • オープンクローズ原則に沿って
  • 合成と再利用の原則に準拠する

弱点は次のとおりです。

  • 集約関係は抽象化レイヤーで確立されるため、開発者は抽象化のための設計とプログラミングを行う必要があり、システム内で独立して変化する2つのディメンションを正しく識別できるため、システムの理解と設計が難しくなります。

5使用シナリオ

ブリッジパターンの一般的な使用例は、継承を置き換えることです。継承には、抽象化、カプセル化、ポリモーフィズムなどの多くの利点があり、親クラスは共通性をカプセル化し、サブクラスは機能を実装することを私たちは知っています。継承はコードの再利用(カプセル化)の機能を非常にうまく実現できますが、これは継承の大きな欠点でもあります。

ブリッジモードは通常、次のシナリオに適しています。

  1. クラスに独立して変化する2つの次元があり、両方の次元を拡張する必要がある場合。
  2. システムが継承を使用したくない場合、またはマルチレベルの継承のためにシステムクラスの数が劇的に増加した場合。
  3. システムがコンポーネントの抽象的な役割と具体的な役割の間に柔軟性を追加する必要がある場合。

6コード例

車の例を続けると、色とモデルは車から分離されています。

6.1カラーファクトリーColorFactory

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-11-01 14:55
 **/
public class ColorFactory {
    @AllArgsConstructor
    public enum Color {
        YELLOW(1, "yellow"),
        RED(2, "red"),
        WHITE(3, "white"),
        BLACK(4, "black"),
        GREEN(5, "green");

        final int value;
        final String desc;

    }

    public String getColor(int code){
        String color = "";
        switch (code){
            case 1:
                color = Color.YELLOW.desc;
                break;
            case 2:
                color = Color.RED.desc;
                break;
            case 3:
                color = Color.WHITE.desc;
                break;
            case 4:
                color = Color.BLACK.desc;
                break;
            case 5:
                color = Color.GREEN.desc;
                break;
        }
        return color;
    }
}

6.2特定の色を取得するConcreteColor

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-11-01 14:30
 **/
public class ConcreteColor {

    private ColorFactory colorFactory = new ColorFactory();

    public String printColor(int code) {
        return colorFactory.getColor(code);
    }
}

6.3モデルファクトリー

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-11-01 14:55
 **/
public class ModelFactory {
    @AllArgsConstructor
    public enum Model {
        SUV(1, "越野车型"),
        SEDAN(2, "轿车");

        final int value;
        final String desc;

    }

    public String getModel(int code){
        String model = "";
        switch (code){
            case 1:
                model = Model.SUV.desc;
                break;
            case 2:
                model = Model.SEDAN.desc;
        }
        return model;
    }
}

6.4ConcreteModelを取得する

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-11-01 14:30
 **/
public class ConcreteModel {

    private ModelFactory modelFactory = new ModelFactory();

    public String printColor(int code) {
        return modelFactory.getModel(code);
    }
}

6.5車の抽象化

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-11-01 14:26
 **/
public interface Car {

    /**
     * 选择颜色
     * @param code 颜色编号
     */
    void setColor(int code);

    /**
     * 选择车型
     * @param code 车型编号
     */
    void setModel(int code);
}

6.6テスラテスラ

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-11-01 15:05
 **/
public class Tesla implements Car{
    private ConcreteColor color = new ConcreteColor();
    private ModelFactory modelFactory = new ModelFactory();

    @Override
    public void setColor(int code) {
        System.out.println(color.printColor(code));
    }

    @Override
    public void setModel(int code) {
        System.out.println(modelFactory.getModel(code));
    }
}

6.7主な機能

/**
 * @program: design-pattern-learning
 * @author: zgr
 * @create: 2021-11-01 14:24
 **/
public class MainClass {
    public static void main(String[] args) {
        Tesla teslaFactory = new Tesla();
        System.out.println("配置颜色与车型:");
        teslaFactory.setColor(3);
        teslaFactory.setModel(2);
    }
}

6.8実行結果

7引用

1.「Dahuaデザインパターン」

2.ブリッジモードの詳細説明(ブリッジモード) 

8ソースコード

https://github.com/airhonor/design-pattern-learning/tree/main/src/com/hz/design/pattern/bridge

おすすめ

転載: blog.csdn.net/honor_zhang/article/details/121079134