BridgeパターンAdvertisement機能と実装の分離
機能と実装をひとつのクラスにまとめていると、機能や実装の追加を行っていくうちにクラス間の関係がわかりにくくなってしまう。ここでいう機能・実装とは次の通り。
機能 クラスが持っているメソッドを利用して処理を行うこと。 実装 処理を実現するためのメソッドのこと。 Bridgeパターンでは、機能と実装を委譲を使って分離する。 利点
サンプルコード
機能を表すクラス
NormalWriterクラス // Formatクラスのメソッドを使用して文章を出力する。 public class NormalWriter{ private Format format; public NormalWriter(Format format){ this.format = format; } // 文章出力 public void write(){ format.header(); format.body(); format.footer(); } } 実装を表すクラス Formatクラス(抽象クラス)
abstract class Format {
abstract public void header();
// 現在時刻を表示する
public void body(){
System.out.println(new java.util.Date().toString());
}
abstract public void footer();
}
HtmlFormatクラス
// HTML文章として出力
public class HtmlFormat extends Format{
public void header(){
System.out.println("<head>");
System.out.println("<title>html</title>");
System.out.println("</head>");
System.out.println("<body>");
}
public void body(){
System.out.println("<p>");
super.body();
System.out.println("</p>");
}
public void footer(){
System.out.println("</body>");
System.out.println("</html>");
}
}
XmlFormatクラス
// XML文章として出力
public class XmlFormat extends Format{
public void header(){
System.out.println("<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>");
System.out.println("<contents>");
}
public void footer(){
System.out.println("</contents>");
}
public void body(){
System.out.println("<date>");
super.body();
System.out.println("</date>");
}
}
Mainクラス(クライアント)
public class Main {
public static void main(String[] args){
Format format = null;
NormalWriter writer = null;
System.out.println("■use HtmlFormat");
format = new HtmlFormat();
writer = new NormalWriter(format);
writer.write();
System.out.println("■use XmlFormat");
format = new XmlFormat();
writer = new NormalWriter(format);
writer.write();
}
}
※実際はクライアントのオブジェクト生成をAbstractFactoryパターンで実現するのが望ましい。出力結果 ■use HtmlFormat <head> <title>html</title> </head> <body> <p> Wed Jun 02 11:29:22 GMT+09:00 2004 </p> </body> </html> ■use XmlFormat <?xml version="1.0" encoding="Shift_JIS"?> <contents> <date> Wed Jun 02 11:29:22 GMT+09:00 2004 </date> </contents> テキストフォーマットで出力するクラスを追加作成する場合や、各フォーマットのヘッダのみを出力するような機能を作成する場合、他のクラスへの影響はまったくないため、既存のコードを修正する必要がない。機能・実装どちらの追加変更に対しても、強い設計となっている。 クラス図
Advertisement |
ショートカット・634トップページ・このカテゴリのトップページに戻る ・634ラボ サイト検索Y!ログール |