ブリッジモード


ブリッジは、抽象化と実装を分離して、この 2 つが独立して変更できるようにするために使用されます。このタイプのデザイン パターンは構造パターンであり、抽象化と実装の間に橋渡し構造を提供することでそれらを切り離します。

このパターンには、ブリッジとして機能するインターフェイスが含まれており、エンティティ クラスの機能をインターフェイス実装クラスから独立させます。どちらのタイプのクラスも、相互に影響を与えることなく構造を変更できます。

次の例を通じてブリッジ パターンの使用法を示します。その中で、同じ抽象クラス メソッドを使用して、異なるブリッジ実装クラスを使用して、異なる色の円を描画することができます。

はじめに

目的: 抽象部分を実装部分から分離し、独立して変更できるようにします。

主な解決策: 多くの変更が考えられる場合、継承を使用するとクラス爆発の問題が発生し、拡張が柔軟性がなくなります。

いつ使用するか: 実装システムには複数の角度分類がある場合があり、それぞれの角度が変更される場合があります。

解決方法: この多角度分類を分離し、それらを独立して変更させ、それらの間の結合を減らします。

キーコード: 抽象クラスは実装クラスに依存します。

応用例: 1. 朱八傑は天鵬元帥から豚に転生しました。転生のメカニズムは、世界を魂と肉体の 2 つのレベルに分けます。前者は抽象化に相当します。実現。機能の委任を通じて、生物は物理的なオブジェクトの機能を呼び出し、生物が動的な選択をできるようにします。 2. 壁のスイッチは、目に見えるスイッチが抽象的なものなので、具体的にどのように実装されているかを気にする必要はありません。

利点: 1. 抽象化と実装の分離。 2. 優れた拡張性。 3. 実装の詳細を顧客に透過的にします。

短所: ブリッジモードの導入により、システムの理解と設計が難しくなります。集約関係は抽象化層で確立されるため、開発者は抽象化のための設計とプログラミングを行う必要があります。

使用シナリオ: 1. システムがコンポーネントの抽象的な役割と具体的な役割の間に柔軟性を追加する必要があり、2 つのレベル間の静的な継承リンクの確立を回避する必要がある場合は、関連付けを確立することができます。抽象レベルでの関係。 2. ブリッジ モードは、継承を使用したくないシステム、またはマルチレベルの継承によりシステム クラスの数が急激に増加するシステムに特に適しています。 3. クラスには 2 つの独立して変化する次元があり、両方の次元を拡張する必要があります。

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

実装

ブリッジとして実装された

DrawAPIインターフェースと、DrawAPIインターフェースを実装するエンティティクラスRedCircleGreenCircleがあります。 Shape は、DrawAPI のオブジェクトを使用する抽象クラスです。 BridgePatternDemo のデモ クラスは、Shape クラスを使用して、さまざまな色の円を描画します。 bridge_pattern_uml_diagram.jpg

ステップ 1

ブリッジ実装インターフェースを作成します。

DrawAPI.java

public interface DrawAPI {
   public void drawCircle(int radius, int x, int y);
}

ステップ 2

DrawAPI インターフェイスを実装するエンティティ ブリッジ実装クラスを作成します。

RedCircle.java

public class RedCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: red, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}

GreenCircle.java

public class GreenCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: green, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}

ステップ3

DrawAPIインターフェースを使用して抽象クラスShapeを作成します。

Shape.java

public abstract class Shape {
   protected DrawAPI drawAPI;
   protected Shape(DrawAPI drawAPI){
      this.drawAPI = drawAPI;
   }
   public abstract void draw();	
}

ステップ 4

Shape インターフェイスを実装するエンティティ クラスを作成します。

Circle.java

public class Circle extends Shape {
   private int x, y, radius;

   public Circle(int x, int y, int radius, DrawAPI drawAPI) {
      super(drawAPI);
      this.x = x;  
      this.y = y;  
      this.radius = radius;
   }

   public void draw() {
      drawAPI.drawCircle(radius,x,y);
   }
}

ステップ 5

Shape クラスと DrawAPI クラスを使用して、さまざまな色の円を描画します。

BridgePatternDemo.java

public class BridgePatternDemo {
   public static void main(String[] args) {
      Shape redCircle = new Circle(100,100, 10, new RedCircle());
      Shape greenCircle = new Circle(100,100, 10, new GreenCircle());

      redCircle.draw();
      greenCircle.draw();
   }
}

ステップ 6

出力を確認します。

りー