デザインパターン - Bridge
【Bridgeパターンとは】
機能階層を実装階層を分離する。
【Bridgeパターンのクラス図】
【Bridgeパターンのメリット】
Bridgeバターンは、機能を拡張するための階層と実装を拡張するための階層を分離することにより、
拡張は容易にできる。http://www.techscore.com/tech/DesignPattern/Bridge.html/
【サンプル】
Display.java |
package bridge;
// 機能階層
public class Display {
// Displayの実装
DisplayImpl impl;
// 異なる実装を与える
// たとえばOS依存のDisplayImpl
public Display(DisplayImpl impl){
this.impl = impl;
}
public void open() {
impl.rawOpen();
}
public void close() {
impl.rawClose();
}
public void print() {
impl.rawPrint();
}
public void display() {
open();
print();
close();
}
}
|
DisplayImpl.java |
package bridge;
// 実装階層
public interface DisplayImpl {
public void rawOpen();
public void rawPrint();
public void rawClose();
}
|
StringDisplayImpl.java |
package bridge;
// 実装階層
public class StringDisplayImpl implements DisplayImpl {
private String text;
public StringDisplayImpl(String text) {
this.text = text;
}
@Override
public void rawOpen() {
printLine();
}
@Override
public void rawPrint() {
System.out.println("*" + this.text + "*");
}
@Override
public void rawClose() {
printLine();
}
private void printLine() {
System.out.print("*");
for(int i = 0; i < this.text.getBytes().length; i++) {
System.out.print("-");
}
System.out.println("*");
}
}
|
BridgeTest.java |
package bridge;
public class BridgeTest {
public static void main(String args) {
// 実装をもたらせる
Display disp = new Display(new StringDisplayImpl("Hello World!!"));
disp.display();
}
}
|
テスト結果 |
|
※繰り返し回数を指定して、本文を繰り返す機能を追加したい!!
MultiDisplay.java |
package bridge;
public class MultiDisplay extends Display{
public MultiDisplay(DisplayImpl impl) {
super(impl);
// TODO 自動生成されたコンストラクター・スタブ
}
public void display(int times) {
super.open();
for(int i = 0; i < times; i++) {
super.print();
}
super.close();
}
}
|
BridgeTest.java |
package bridge;
public class BridgeTest {
public static void main(String args) {
// 実装をもたらせる
// Display disp = new Display(new StringDisplayImpl("Hello World!!"));
// disp.display();
// 実装をもたらせる
MultiDisplay multiDisp = new MultiDisplay(new StringDisplayImpl("Hello World!!"));
// 既存の実装が使える
multiDisp.display();
// 新規機能が使える
multiDisp.display(5);
}
}
|
テスト結果 |
*-------------*
*Hello World!!*
*-------------*
*-------------*
*Hello World!!*
*Hello World!!*
*Hello World!!*
*Hello World!!*
*Hello World!!*
*-------------*
|