デザインパターンを覚えたい (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.xmlbuild:
test:
[java] ProxyWriter: create
[java] ProxyWriter: pushString [hoge]
[java] ProxyWriter: pushString [fuga]
[java] ProxyWriter: pushString [puni]
[java] ProxyWriter: saveString
[java] RealWriter: create
[java] RealWriter: saveStringBUILD 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); } }