やあ!私たちはこれからも、デザイン パターンという広範で非常に重要な有益なトピックを掘り下げていきます。今日はブリッジパターンについてお話しましょう。他のパターンと同様、ブリッジ パターンは、開発者がソフトウェア アーキテクチャを設計するときに遭遇する典型的な問題を解決するのに役立ちます。今日は、このパターンの特徴とその使用方法を調べてみましょう。
ここでは、互いの機能に影響を与えることなく変更できる 2 つの独立した構造がわかります。私たちの場合には:
ブリッジパターンとは何ですか?
ブリッジパターンは構造設計パターンです。言い換えれば、その主な仕事は、クラスとオブジェクトから本格的な構造を作成することです。ブリッジは、1 つ以上のクラスを別の階層 (抽象化と実装)に分割することでこれを実現します。一方の階層の機能が変更されても、もう一方の階層の変更は伴いません。それはそれでいいのですが、この定義は非常に広義であり、「ブリッジ パターンとは何ですか?」という最も重要な質問には答えていません。実際の応用例も理解しやすいと思います。それでは早速、ブリッジ パターンの古典的なシナリオを作成してみましょう。Shape一般的な幾何学的図形を表す 抽象クラスがあります。
-
シェイプ.java
public abstract class Shape { public abstract void draw(); }三角形や四角形などの図形を追加することに決めたら、それらに
Shapeクラスを継承させます。 -
長方形.java:
public class Rectangle extends Shape { @Override public void draw() { System.out.println("Drawing rectangle"); } } -
トライアングル.java:
public class Triangle extends Shape { @Override public void draw() { System.out.println("Drawing triangle"); } }
draw()この色に依存します。メソッドをさまざまに実装するにはdraw()、形状と色の組み合わせごとにクラスを作成する必要があります。3 つの色がある場合、TriangleBlack、TriangleGreen、TriangleRed、RectangleBlack、RectangleGreenの6 つのクラスが必要ですRectangleRed。6クラスはそれほど大きな問題ではありません。しかし!新しい形や色を追加する必要がある場合、クラスの数は指数関数的に増加します。この状況から抜け出すにはどうすればよいでしょうか?フィールドに色を保存し、条件ステートメントを使用してすべてのオプションを列挙することは、最良の解決策ではありません。良い解決策は、色を別のインターフェイスに移動することです。。言ったらすぐに完了です。 、 、Colorの 3 つの実装を備えたインターフェイスを作成しましょう。 BlackColorGreenColorRedColor
-
カラー.java:
public interface Color { void fillColor(); } -
BlackColor.java:
public class BlackColor implements Color { @Override public void fillColor() { System.out.println("Filling in black color"); } } -
GreenColor.java
public class GreenColor implements Color { @Override public void fillColor() { System.out.println("Filling in green color"); } } -
RedColor.java
public class RedColor implements Color { @Override public void fillColor() { System.out.println("Filling in red color"); } }Color次に、クラスにフィールドを追加しますShape。コンストラクターでその値を取得します。 -
シェイプ.java:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }color実装では変数を使用しますShape。これは、シェイプがインターフェイスの機能を使用できるようになったということを意味しますColor。 -
Rectangle.java
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color colorは、2 つの別個のクラス階層をつなぐ架け橋です。
ブリッジの構築方法: 抽象化と実装
ブリッジ パターンを表すクラス図を見てみましょう。
ここでは、互いの機能に影響を与えることなく変更できる 2 つの独立した構造がわかります。私たちの場合には:
Shape抽象化はクラスです- RefinedAbstraction は
TriangleとRectangleクラスです Color実装者はインターフェースです- ConcreteImplementor は
BlackColor、GreenColorおよびRedColorクラスです。
Shapeクラスは抽象化、つまりさまざまな色で図形を塗りつぶすことを管理するメカニズムであり、Colorインターフェイス (実装者) に委任されます。およびクラスはTriangle、クラスRectangleによって利用可能になるメカニズムを使用する具象クラスですShape。 BlackColor、GreenColorおよび は、RedColor実装階層内の具体的な実装です。
ブリッジパターンを使用する場所
このパターンを使用する大きな利点は、一方の階層のロジックを壊すことなく、一方の階層の関数クラスを変更できることです。また、このアプローチはクラス間の結合を減らすのにも役立ちます。このパターンを使用する場合の主な要件は、「指示に従う」ことです。どの指示も無視しないでください。そのために、ブリッジ パターンを必ず使用する必要がある状況を考えてみましょう。-
2 つの概念 (形状と色など) の組み合わせに基づいてエンティティの数を拡張する必要がある場合。
-
単一責任の原則を満たさない大規模なクラスを、機能が限定された小さなクラスに分割する場合。
-
プログラムの実行中に特定のエンティティのロジックを変更する必要がある場合。
-
クラスまたはライブラリのクライアントから実装を隠す必要がある場合。
パターンの長所と短所
他のパターンと同様、ブリッジには長所と短所の両方があります。 ブリッジ パターンの利点:- コードのスケーラビリティが向上します。プログラムの別の部分で何かが壊れるのを恐れることなく、機能を追加できます。
- エンティティの数が 2 つの概念 (形状と色など) の組み合わせに基づいている場合に、サブクラスの数が削減されます。
- これにより、抽象化と実装という 2 つの別個の階層で個別に作業できるようになります。2 人の異なる開発者が、互いのコードの詳細を掘り下げることなく変更を加えることができます。
- これにより、クラス間の結合が減少します。2 つのクラスが結合される唯一の場所はブリッジ (つまり、フィールド
Color color) です。
- 特定の状況やプロジェクトの全体的な構造によっては、プログラムのパフォーマンスに悪影響を及ぼす可能性があります (たとえば、より多くのオブジェクトを初期化する必要がある場合)。
- 2 つのクラスを切り替える必要があるため、コードが読みにくくなります。
GO TO FULL VERSION