読者です 読者をやめる 読者になる 読者になる

【オブジェクト指向のこころ】第7章 Adapterパターン 解答

オブジェクト指向のこころ 第7章の練習問題の解答をまとめてみる。

基礎

Adapterを定義してください.

Adapterとは,あるものを変換して別のものに合わせるもの.

Adapterパターンの目的は何でしょうか?

修正することのできない既存オブジェクトを,特定のインターフェースに適合させること.
(p.97)

Adapterパターンの因果関係とは何でしょうか?例を挙げてください.

Adapterパターンの因果関係は,既存オブジェクトをそのインターフェースに制限されることなく,新たなクラス構造に取り込むこと(?).
(p.97)

例として,書籍中では円オブジェクトを使って描画するプログラムが挙げられている. そこでは,問題として既存のオブジェクトは,システム内の他のオブジェクトと同じメソッドを持っていないことがある. そこで,Adapterはそれらのメソッドを変換することで,既存の円オブジェクトを使って描画することができる.
(p.95)

ShapeとPoint, Line, Squareの間の関係を定義するために使用されているオブジェクト指向の概念とは何でしょうか?

ポリモーフィズム

Adapterパターンの最も一般的な使用方法とは何でしょうか?

ポリモーフィズムを引き続き使う用. 他のデザインパターンとも連携して使われる.

Adapterパターンを採用することによって,どういったことを意識しなくてもよいようになるのでしょうか?

既存クラスのインターフェースを意識しなくてすむ. もしクラスが所望のインターフェースを持っていない場合,Adapterを使って正しいインターフェースを作ることになる.

Adapterパターンは2種類に分類できます.それらを答えてください.
  • Object Adapter パターン
    • あるオブジェクトが他のオブジェクトを保持する
  • Class Adapter パターン
    • 多重継承を使用してインターフェースを提供する

(p.98)

応用

GoFはAdapterパターンの目的を「あるクラスのインターフェースを,クライアントが望むインターフェースに変換する」ものであると述べています.
  • この意味を説明してください
  • 例を挙げてください

あるメソッド呼び出しを通じて,別のクラスとやり取りする必要があるクラスがあったとする. もし,別のクラスのインターフェースがそのメソッド呼び出しを提供していなかったとき,Adapterが変換のためのインターフェースを行う.

例として,2つの異なるデータベースからデータを取得するアプリを挙げる. そのアプリは,データベースから情報を取るときにGetDate関数を使いたい. しかしデータベースはそんなAPIは提供していない. そこで,Adapterを新たに作り,そのインターフェースの中でGetDate関数を提供することとする.

「CircleオブジェクトはXXCircleオブジェクトのラッパです」という表現はどういう意味を持っているのでしょうか?

CircleはXXCircleをシステムから完全に分離することを意味する. CircleはXXCircleのシステムへの振る舞いを決める.

FacadeパターンとAdapterパターンは,一見するとよく似ています.これら2つの本質的な違いを述べてください.

どちらも,欲しい機能をもつクラスがすでに存在している. どちらも,新規オブジェクトを生成することで望みどおりのインターフェースを実現している. どちらもラッパーである.

しかし以下の点で異なる. Adapterは,クライアントが所望のインターフェースを決めていて,ポリモーフィズムを使いたいときに用いられる. Facadeは,既存オブジェクトのよりシンプルなインターフェースが欲しいときに用いられる.

以下はソフトウェアとは関係ないAdapterの例です:国連でさまざまな国の外交官たちが集まり,自国の立場を自国の言語で討論していると考えてください.この時,通訳はある言語から他の言語への変換を行うことで,架空の外交官を「動的に」作り出し,受け手が聞きたい,そして聞く必要のあることを伝えています.
  • 実生活におけるAdapterの例をもう一つ挙げてください.

別の例として,旅行代理店がある. 旅行を設定したい旅行者と独自システムをもつ航空会社間を考えると, それぞれ言語が異なるため,旅行代理店が間に入ってやりとりを変換する.

yusuke-ujitoko.hatenablog.com