オブジェクト指向のこころー演習問題(第6部)


第17章:Decoratorパターン

機能を付与するとき、サブクラスではなく、オブジェクトに付与することで行う。

基礎

Q1. 各Decoratorパターンは何を包み込むのでしょうか?
A1. オブジェクト

Q2. デコレータの例を2つ挙げてください
A2.
・ヘッダー・フッターの付与:オブジェクトを実体化しておく時に、デコレータで、フッターとヘッダーを付与する。
・ストーリームIO:データの伸長or圧縮や復号化などを行う場合、デコレータの付与で多様な事態に対応できる。

応用

Q1. 問題を分割する際、Decoratorパターンはどういう風に使用することができるでしょうか?
A1.
・新たな機能を付加するオブジェクトの実装方法(Factory)
・特殊ケース毎における、オブジェクトの体系化方法(Decorator)

Q2. 「この構造がパターンなのではありません。」Decoratorパターンの本質を考察する際、こういった表現をしようしました。この意味を答えてください。なぜこれが重要となるのでしょうか?
A2. 実行される機能を付加すること事態は、Decoratorパターンの機能であるということ。パターンは、このように使用出来るようにすることである。これによって、目的と実装の違いを明確にするために、重要である。

第18章:Observerパターン

基礎

Q1. GoFによる構造に関するパターンの責務とは何でしょうか?
A1. 既存の機能群を結びつけるために使用するもの。

Q2. GoFが分類したパターンのカテゴリを答えてください。また、私が示唆している4つ目のカテゴリとは何でしょうか?
A2.
GoF
・生成:オブジェクトの生成や実体化
・構造:既存オブジェクトをまとめる
・振る舞い:柔軟な振る舞いを実現する
筆者
・分割:スケーラビリティと柔軟性を向上させる

Q3. 要求の持つ絶対的な性質を答えてください。
A3. 要求は常に変化する。

Q4. Observerパターンの目的を答えてください。
A4. オブジェクト間に一対多の依存関係を定義し、あるオブジェクトの状態が変化した際、それに依存するすべてのオブジェクトに対して自動的に通知、更新が行われるようにする。

応用

Q1. BridgeパターンとDecoratorパターンが、振る舞いに関するパターンではなく、構造に関するパターンに分類される理由を答えてください。
A1. どちらも既存の実装があり、それに対して、新しい構造を生み出すためのものだから

Q2. Observerパターンを解説する際、ソフトウェアとは無関係な放送局を例に挙げました。放送局は電波を送信し、誰でも気が向いた時にチューニングするだけで聞くことができる。これ以外の「実生活における例」を挙げてください。
A2. 掲示板?

Q3. Observerパターンを使用すべきでない状況を答えてください。
A3. 依存関係が常にきまっている場合

第18章 Template Methodパターン

基礎

Q1. Template Methodパターンによって、メソッド呼び出しが特殊な方法で行われるようになります。その方法を説明してください
A1. 処理をまとめたメソッドと変化する処理毎に抽象メソッドを用意するが、処理をまとめたメソッドから、呼び出す。その際、派生クラス中に定義するメソッドは、abstractあるいはprotedtedで基底クラス内では宣言する。

応用

Q1. GoFによれば、Template Methodパターンの目的は、「ある操作におけるアルゴリズムの骨格を定義し、いくつかの処理の定義についてはサブクラスにまかせる。そして、アルゴリズムの構造を変更することなく、その中に含まれている処理の再定義を行う」となっています。これはどういったことを意味しているのでしょうか?
A1. ある操作について、基底クラス内に定義し、その操作のうち、詳細の異なる処理を派生クラスで定義する。

Q2. GoFはこのパターンを「Template Method」と呼んでいます。なぜだと思いますか?
A2. 基本的な手順を定義するため。

Q3. StrategyパターンとTemplate Methodパターンの違いを答えてください。
A3. Strategyパターンは、複数のアルゴリズム(Concrete Strategy)を基底クラス(Strategy)によってまとめ、使用方法を基底する。一方、実際に何を使用するかは、Contextが、クライアントからルールとConcrete Strategyを受取り、処理される。
よって、Template Methodパターンは、基底クラスのTemplateMethod()を使用し、一部詳細が変わる部分をConcrete Classが担うのに対して、Strategyでは、基底クラスはインタフェースと共通した情報を保持し、メソッドは各Concrete Classに任される。