デザインパターンを覚えたい (Proxy)

Proxyパターン

必要になってから作るパターン。実際の処理との間に一段クラスをかませることで、必要になるまで実処理の実行を抑止させる。
ポイントは

  • ワンクッション挟むことで途中までの処理を肩代わりさせる
  • 使う側からはProxyも実処理も透過的に見せる

とかかな。ホンダとDecoratorパターンとの類似性を指摘してるけど、個人的にはChain of Responsibilityパターンとなんとなく類似性を感じる。

実装。サンプルと若干かぶるけど、ファイル書き込みのProxy。
http://dl.dropbox.com/u/7810000/code/design_pattern/proxy.zip

実行。test.txtというファイルができます。

$ ant test
Buildfile: /Users/xxx/tmp/proxy/build.xml

build:

test:
[java] ProxyWriter: create
[java] ProxyWriter: pushString [hoge]
[java] ProxyWriter: pushString [fuga]
[java] ProxyWriter: pushString [puni]
[java] ProxyWriter: saveString
[java] RealWriter: create
[java] RealWriter: saveString

BUILD SUCCESSFUL
Total time: 0 seconds
$ cat test.txt
hoge
fuga
puni

ポイントはProxy内でファイル保存のタイミングでRealを呼び出しているところ。

public class ProxyWriter implements Writer {
    private List<String> lines;
    private Writer real = null;

    public ProxyWriter() {
        System.out.println("ProxyWriter: create");
        lines = new ArrayList<String>();
    }

    public void pushString(String str) {
        System.out.println("ProxyWriter: pushString [" + str + "]");
        lines.add(str);
    }

    public void saveString(String file) {
        System.out.println("ProxyWriter: saveString");
        /* RealWriterに仕事を渡す */
        if (real == null) real = new RealWriter(lines);
        real.saveString(file);
    }
}