Index
Java言語で学ぶデザインパターン入門第3版
参考書籍では以下のように説明されています。
機能のクラス階層と実装のクラス階層を橋渡しするデザインパターン
ふむ何言ってるかわかりませんね。
サンプルコードを見る前に機能のクラス階層と実装のクラス階層について説明します。
ポイントは2つ
- スーパークラスは基本的な機能を持っている
- サブクラスで新しい機能を追加する
クラス図で書くとこんな感じの階層になります。
ポイントは2つ
- スーパークラスは抽象メソッドによってインターフェースを定義している
- サブクラスは具象メソッドによってそのインターフェースを実装する
クラス図で書くと以下のようになります。
- 実装のクラス階層と、機能のクラス階層を分離して管理することができる
- 拡張するのが楽になる
何かを表示するためのクラス。
実際の処理はDisplauImplクラスにお任せしてしまします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class Display { private final DisplayImpl m_impl; Display(final DisplayImpl impl){ m_impl = impl; } public void start() { m_impl.start(); } public void print() { m_impl.print(); } public void end() { m_impl.end(); } public final void display() { start(); print(); end(); } } |
Displayクラスに新たな機能を追加したクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class CountDisplay extends Display { public CountDisplay(final DisplayImpl impl) { super(impl); } public void multiDisplay(final int times) { start(); for(int i = 0; i < times ; i++) { print(); } end(); } } |
処理のインターフェースを定義するクラス
1 2 3 4 5 |
public abstract class DisplayImpl { public abstract void start(); public abstract void print(); public abstract void end(); } |
本当の実装を書いているクラスです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class StringDisplayImpl extends DisplayImpl{ private String m_str; public StringDisplayImpl(final String string) { m_str = string; } @Override public void start(){ printLine(); } @Override public void print() { System.out.println(m_str); } @Override public void end() { printLine(); } private void printLine() { System.out.println("**************"); } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
public class Main { public static void main(String[] args) { final Display display = new Display(new StringDisplayImpl("Hello")); final Display display2 = new CountDisplay(new StringDisplayImpl("Hello")); final CountDisplay display3 = new CountDisplay(new StringDisplayImpl("Good")); display.display(); display2.display(); display3.display(); display3.multiDisplay(3); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
************** Hello ************** ************** Hello ************** ************** Good ************** ************** Good Good Good ************** |
①実装のクラス階層と、機能のクラス階層を分離して管理することができる
機能のクラス階層と、実装のクラス階層を分離して管理するのがBridgeパターンの特徴です。
そのため、各階層を独立して拡張することができます。
②拡張が楽になる
①で独立して拡張できるため、拡張するのが楽です。
またDisplayクラスでは実際の処理は引数で渡ってきた、DisplayImplクラスにお任せしているので、結びつきが緩いので、拡張しやすいです。
併せてご覧ください。
TemplateMethodパターン@Java言語で学ぶデザインパターン入門