Bridge パターン
来源:互联网 发布:工作日报管理系统源码 编辑:程序博客网 时间:2024/05/16 05:54
转自:http://itpro.nikkeibp.co.jp/article/COLUMN/20060113/227227/
第9章では Brigte パターンを学びます。Bridgeパターンとは、「Bridge」すなわち「橋」の役割を果たすパターンです。Bridgeパターンを利用することで、クラスと実装を分離して、それぞれを独立に拡張することができるようになります。
例えば、ある methodA というメソッドを持つクラス MyClassA は、methodA メソッドの実装が異なる MyClassASub1、MyClassASub2 という2つのクラスによって継承されているとします。このとき、MyClassA にmethodB というメソッドを追加するために、MyClassB クラスという MyClassA を継承するクラスを作成したことを考えてください。
このとき、MyClassB でも、MyClassASub1、MyClassASub2 で実装している methodA と同じ実装を利用したい場合、MyClassB クラスを継承する MyClassBSub1、MyClassBSub2 といったクラスを作成する必要があります。
今回のように、2つのクラスだけなら手間はそんなにかかりませんが、場合によっては、MyClassA に機能を追加するためのサブクラス MyClassX を作成するたびに、何十という MyClassXSub・・・ というサブクラスを作成することが必要となります。Bridge パターンは、機能を拡張するための階層と実装を拡張するための階層を分離することにより、このようなわずらわしさを解消し、拡張を容易にするものです。
9.2 サンプルケース
サンプルケースでは、ソート機能を持つ抽象クラスSorter と、この Sorter クラスで定義されている抽象メソッドである sort(Object obj[]) メソッドを実装するクラス (QuickSorter クラス、BubbleSorter クラス) について考えて見ましょう。Sorter クラス、QuickSorter クラス、BubbleSorter クラスのコードはそれぞれ以下のようになっています。ソート部分の実装に関しては、ここでは重要でないため省きます。
public abstract class Sorter{
public void sort(Object obj[]);
}
public abstract class QuickSorter extends Sorter{
public void sort(Object obj[]){
// クイックソートで obj[] をソートする
・・・・
}
}
public abstract class BubbleSorter extends Sorter{
public void sort(Object obj[]){
// バブルソートで obj[] をソートする
・・・・
}
}
この状態のクラス図を見てみましょう。
さて、ここであなたは、Sorterクラスにソートにかかった時間を表示する機能を持つ timerSorter メソッドを追加したくなりました。そこで、Sorter クラスを拡張する TimerSorter クラスを作成しました。ソースコードは以下のようになります。
public abstract class TimerSorter extends Sorter{
public void timerSorter(Object obj[]){
long start = System.currentTimeMillis();
sort(obj);
long end = System.currentTimeMillis();
System.out.println("time:"+(end - start));
}
}
このような場合、以上のような設計ではとても面倒なことに気づかれたでしょうか?そうです、TimerSorter クラスに sort の実装を与えるクラスが存在しないのです。せっかく QuickSorter クラスや BubbleSorter クラスが存在しているにもかかわらず、同様の実装を与えるために、TimerSorter クラスを拡張する TimerQuickSorter クラスや TimerBubbleSorter クラスを作成する必要があるのです。このときのクラス図は以下のようになります。
このような問題を回避するためのパターンとして Bridge パターンが利用されます。Bridge パターンでは、実装の変更が考えられるメソッドに関しては、実装用のクラス階層に委譲するように設計します。実装用のクラス階層とは、ここでは sort メソッドの実装を与えるクラス階層として、SortImple クラスを親とするクラス階層を考えます。クラス具体的には、Sorter クラス、SortImple クラスを以下のようなコーディングにしておきます。
public class Sorter{
private SortImple sortImple;
public Sorter(SortImple sortImple){
this.sortImple = sortImple;
}
public void sort(Object obj[]){
sortImple.sort(obj);
}
}
public abstract class SortImple{
public void sort(Object obj[]);
}
そして、実際にソートの機能を実装する QuickSorter クラスと BubbleSorter クラスを SortImple クラスを継承するクラスとして作成するようにします。
public class QuickSortImple{
pubic void sort(Object obj[]){
// クイックソートで obj[] をソートする
・・・・
}
}
public class BubbleSortImple{
pubic void sort(Object obj[]){
// バブルソートで obj[] をソートする
・・・・
}
}
この状態でのクラス図を確認しておきましょう。
このような設計にしておくと、機能を追加するために、Sorter クラスを拡張して作成した新しいクラスでも、すでに存在する実装部分を利用することができるようになります。例えば、Sorter クラスを拡張する TimerSorter クラスを作成する場合には、以下のようなコーディングとなります。
public class TimerSorter extends Sorter{
public TimerSorter(SortImple sortImple){
super(sortImple);
}
public void timerSort(Object obj[]){
long start = System.currentTimeMillis();
sort(obj);
long end = System.currentTimeMillis();
System.out.println("time:"+(end - start));
}
}
このように、機能を拡張するためのクラス階層と、実装を拡張するためのクラス階層を分けておくことで、実装階層クラスと機能拡張クラスを好みの組み合わせで利用することができるようになります。今回の例では、Sorter クラスと SortImple クラスが機能拡張クラス階層と実装拡張クラス階層を橋渡しする役目を果たしています。
9.3 Bridge パターンのまとめ
Bridge パターンの一般的なクラス図は以下のようになります。
[引用] 『Java言語で学ぶ デザインパターン入門』(結城浩 ソフトバンクパブリッシング株式会社出版 2001年)
- Bridge パターン
- Bridge
- Bridge
- Bridge
- Bridge
- bridge
- bridge
- Bridge
- Bridge
- Bridge
- Bridge
- Bridge Pattern
- Bridge pattern
- Bridge模式
- Bridge Pattern
- Bridge模式
- Bridge 讨论
- BRIDGE.exe
- Silverlight实例教程 - Out of Browser与Office的互操作
- 呜呜 今天好无聊哦
- 游戏开发经验:浅谈游戏
- 浅谈游戏收费模式对游戏设计的影响
- Nokia查询手机固件版本(手机型号或类型标志符)及CODE
- Bridge パターン
- 前台线程和后台线程
- 继续vb
- GetCursorPos/WindowFromPoint/SendMessage
- AutoResetEvent 与 ManualResetEvent
- 为什么用hibernate存储blob变量(SerialBlob)后字节会变大?
- 英语中常见的123个中国成语
- 用hibernate存储BLOB为什么字节会变大?
- 五种提高 SQL 性能的方法