Bridge Pattern

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