【読書会メモ】Java言語で学ぶデザインパターン入門(9)

実施日時:2019/10/2
対象範囲:第21章~第22章
参加者:yodai、yoridori、くめごん、kassyi

21章 Proxy
概要
Proxyとは代理人という意味
本人の代わりに代理人がある程度の仕事をしてくれる。

サンプル
文字列(名前)を出力するプリンタプログラムを作成する。
名前の設定や取得ではPrinterProxyクラスが行うが、printを行う時にPrinterProxyクラスがprintクラスのインスタンスを生成する。
setPrinterNameやgetPrinterNameを呼んでもPrinterインスタンスは生成されない
インスタンスはprinterメソッドを呼んだ時に生成される。

PrinterクラスはPrinterProxyの存在をしらないが、PrinterProxyクラスはPrinterクラスを知っている。
なぜなら、realフィールドはPrinter型であり、PrinterクラスをNewする必要があるから。

Mainクラスにおいて、Printerのインスタンスはprintメソッドを呼びだしてから生成されている。

練習問題 yodaiさん
realize()にsynchronizedを付けないと、複数のスレッドで呼んだ場合、予期しないインスタンスが作成される可能性がある。
setPrinterName()にsynchronizedを付けないと異なった名前になる?

ProxyパターンではProxy役が代理人として処理を肩代わりする。
初期化に時間がかかる機能がたくさん存在している場合、起動後に初期化を実行する方が良い。

代理人だけで処理できれば代理人が処理して、処理しきれない場合は本人にお任せする。
HttpのProxyも同様、プロキシがキャッシュしていればそれを表示する。
キャッシュがなかったらサーバーに取りに行く。
WebブラウザがClient役、HttpプロキシーがProxy役、WebサーバーがRealSubject役

22章 Command
概要
命令をクラスのインスタンスという一個のものとして表現することができる。
命令は、CommandまたはEvent呼ぶ
サンプル
3つのパッケージに分かれている。
命令に関するもの、描画に関するもの、Main処理。
Commandインタフェースは命令を表現するためのものである。
MacroCommandは、複数の命令をまとめた命令
Stackに命令を追加している。
DrawCanvasクラスでは、Drawableインタフェースを実装しているクラス。
描画するべき命令の集合はhistoryフィールドにある。

登場人物
Command役
 命令のインタフェースを定義
ConcreteCommand役
 インタフェースを実装、MacroCommandとDrawCommand
Client役
 ConcreteCmmand役を生成してReciver役を割り当てる
 Mainクラス
Invoker役
 命令の実行を開始する
 MainとDrawCanvas

ヒント
命令へどれだけ情報を持たせるかは目的により異なる
描画対象が複数存在するようなプログラムはdrawableフィールドが役に立つ
アダプター
Mainは3つのインタフェースを実装しているが、使っているメソッドはその一部
MouseMotionAdapterクラスのサブクラスを作って必要なメソッドを実装するだけで目的が達成される。
実装した内容は空でもOK

yodaiさん
実態を意識しないでexecuteを呼ぶと何か知らないけれどやってくれる
実装は不明だがAPIが決まっていればやってくれる。
Mainでパラメータを渡しても渡さなくても、executeを呼ぶとやってくれる。

この記事が気に入ったらサポートをしてみませんか?