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>

テキストフォーマットで出力するクラスを追加作成する場合や、各フォーマットのヘッダのみを出力するような機能を作成する場合、他のクラスへの影響はまったくないため、既存のコードを修正する必要がない。機能・実装どちらの追加変更に対しても、強い設計となっている。

クラス図

Bridge

Advertisement

ショートカット

634トップページ
このカテゴリのトップページに戻る
634ラボ

サイト検索

Google

Web サイト内

Y!ログール