コンセプト
そのブリッジモードブリッジモード。名前が示すように、この作用様式はのクラスで機能的な階層とクラス階層実装接続を。
- 機能階層
Something
-SomethingGood
-SomethingBetter
構造は、それらの間の機能の階層で、機能していない親クラスのサブクラスを追加します。
- 実現の階層
AbstractClass
-ConcreteClass
-AnotherConcreteClass
テンプレートメソッドと同様に、当該親プロセス、育児クラスの実装の詳細:職務の分離を達成するために-サブクラス継承と抽象メソッドを実装して、パターン、例えば、親クラスが抽象メソッドが使用の抽象メソッドを定義する宣言しますタスクの電荷分布、タスクを完了するための責任者をリード。親と子のクラス間のこのような関係は、階層構造を達成することです。なお:ちょうど機能を実現したサブクラスは、機能を追加しません。
それを明確にするサブクラスを追加する場合:私は、新しい機能を追加したい、または別の増加を達成するために?混合した場合、構造が複雑になり、それは明らかではありません。
完全に独立している場合でも、彼らが接触を欠いているので、我々は橋構築する必要があります-ブリッジモードを、具体的な実践:継承拡張子を使用し、達成するために、デリゲート関数を使用します
コード
- 親
public class Display {
private DisplayImpl displayImpl;
public Display(DisplayImpl displayImpl) {
this.displayImpl = displayImpl;
}
public void open() {
displayImpl.rawOpen();
}
public void print() {
displayImpl.rawPrint();
}
public void close() {
displayImpl.rawClose();
}
public final void display() {
open();
print();
close();
}
}
- 機能クラス階層
public class CountDisplay extends Display{
public CountDisplay(DisplayImpl displayImpl) {
super(displayImpl);
}
public void multiDisplay(int times) {
open();
for (int i = 0; i < times; i++) {
print();
}
close();
}
}
- 実装クラス階層
public abstract class DisplayImpl {
public abstract void rawOpen();
public abstract void rawPrint();
public abstract void rawClose();
}
public class StringDisplayImpl extends DisplayImpl {
private String string; // 要显示的字符串
private int width; // 以字节单位计算出的字符串的宽度
public StringDisplayImpl(String string) { // 构造函数接收要显示的字符串string
this.string = string; // 将它保存在字段中
this.width = string.getBytes().length; // 把字符串的宽度也保存在字段中,以供使用。
}
public void rawOpen() {
printLine();
}
public void rawPrint() {
System.out.println("|" + string + "|"); // 前后加上"|"并显示
}
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("+"); // 显示用来表示方框的角的"+"
for (int i = 0; i < width; i++) { // 显示width个"-"
System.out.print("-"); // 将其用作方框的边框
}
System.out.println("+"); // 显示用来表示方框的角的"+"
}
}
- ラン
public static void main(String[] args) {
Display d1 = new Display(new StringDisplayImpl("Hello, China."));
Display d2 = new CountDisplay(new StringDisplayImpl("Hello, World."));
CountDisplay d3 = new CountDisplay(new StringDisplayImpl("Hello, Universe."));
d1.display();
d2.display();
d3.display();
d3.multiDisplay(5);
}
/*结果*/
+-------------+
|Hello, China.|
+-------------+
+-------------+
|Hello, World.|
+-------------+
+----------------+
|Hello, Universe.|
+----------------+
+----------------+
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
|Hello, Universe.|
+----------------+
役割
抽象化(抽象化):機能的分類の階層の最上位に位置、最も基本的な定義、実装者例の節約、本実施の形態では、Displayクラスによって実装されています。
RefinedAbstraction(改善抽象):本例では、抽象化に基づいてCountDisplayクラスが果たした役割を、この新機能の役割を高めます。
実装者(実装)は:DisplayImplによって果たさこの役割本実施例では、抽象インタフェースを達成するための方法を定義します。
ConcreteImplementor(特定の実装者は):定義されたインタフェースを実装するための責任を実装します。この場合、StringDisplayImplこの役割。
クラス図
考え
- 独立した後に、より簡単に拡張
特長ブリッジモードでのクラスである拡張機能の階層とクラスが拡張階層を実装する利点は、それらが拡大するための独立を支持しているように、分離しました。
たとえば、Windows、MacOSの、Linuxソフトウェアで3つのバージョンを開発する必要性で実行されています。私たちは、その後、ConcreteImplementorを対応する各バージョンを書くので、開発の実装レベルを完了し、ブリッジモード、実装者の定義を使用することができます。次に、機能レベルは、機能の数を増やす必要があるかどうか、それはすべての3つのオペレーティングシステム上で動作することができます。
- 継承と委譲
継承は強力な関係は、信頼が弱い関係です。
観察オープンDisplayクラス、近くに、印刷の3つのメソッドを実装し、彼らは方法DisplayImplを呼び出しています。ディスプレイのカテゴリは、信頼と呼ばれるDisplayImpl作業クラスに引き渡されます。我々はコンストラクタ表示内部のパラメータとして渡されるXXXDisplayImpl、さまざまなを達成し、前提のDisplayクラスと下位クラスDisplayImplを変更せずに実装を変更することができます。これはメリット手数料です。