Bridge Pattern http://www.k.hosei.ac.jp/~yukita/
Bridge パターンの目的 機能のクラス階層と具体化レベル(抽象化)のクラス階層を直行させる。 具体化レベルは2階層だけのことが多い。この場合,「実装の切り替え」と言ったほうが分かりやすい。 Bridge Pattern
例題のクラス図 Display impl open print close display DisplayImpl rawOpen rawPrint rawClose CountDisplay multiDisplay StringDisplayImpl rawOpen rawPrint rawClose Bridge Pattern
クラス一覧 Bridgeのどちら 名前 説明 機能のクラス階層 Display 「表示する」クラス CountDisplay 「指定回数だけ表示する」という機能を追加したクラス 具体化の階層 DisplayImpl StringDisplayImpl 「文字列を使って表示する」クラス Main Bridge Pattern
Display.java (1) public class Display { private DisplayImpl impl; public Display(DisplayImpl impl) { this.impl = impl; } public void open() { impl.rawOpen(); public void print() { impl.rawPrint(); Bridge Pattern
Display.java (2) public void close() { impl.rawClose(); } public final void display() { open(); print(); close(); Bridge Pattern
CountDisplay.java public class CountDisplay extends Display { public CountDisplay(DisplayImpl impl) { super(impl); } public void multiDisplay(int times) { open(); for (int i = 0; i < times; i++) { print(); close(); Bridge Pattern
DisplayImpl.java public abstract class DisplayImpl { public abstract void rawOpen(); public abstract void rawPrint(); public abstract void rawClose(); } Bridge Pattern
StringDisplayImpl.java (1) public class StringDisplayImpl extends DisplayImpl { private String string; private int width; public StringDisplayImpl(String string) { this.string = string; this.width = string.getBytes().length; } Bridge Pattern
StringDisplayImpl.java (2) public void rawOpen() { printLine(); } public void rawPrint() { System.out.println("|" + string + "|"); public void rawClose() { Bridge Pattern
StringDisplayImpl.java (3) private void printLine() { System.out.print("+"); for (int i = 0; i < width; i++) { System.out.print("-"); } System.out.println("+"); Bridge Pattern
Main.java public class Main { public static void main(String[] args) { Display d1 = new Display( new StringDisplayImpl("Hello, Japan.")); 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); } Bridge Pattern
実行結果 +-------------+ |Hello, Japan.| |Hello, World.| +----------------+ |Hello, Universe.| Bridge Pattern
パターン Abstraction impl method1 method2 Implementor implMethodX implMethodY RefinedAbstraction refinedAbstractionA refinedAbstractionB ConcreteImplementor implMethodX implMethodY Bridge Pattern