第2章 Adapter - 増補改訂版Java言語で学ぶデザインパターン入門

この本の第2章は、私が知る限り、もっとも分かりやすく「委譲とは何か」を説明してると思います。結城さんの説明、好きだー。

さて、というわけで、Adapterパターンの復習メモ。

Adapterパターンでは、すでに提供されているクラスに手を加えずに、必要なインタフェースを用意できる、とあります。また、使う側(クライアント)のコードを変えずに、Adapterが継承した「提供されているクラス」内部の実装を変更をできます。

Adapterパターンとして、2種類の実装が紹介されている。

  • 継承を使ったAdapterパターン
  • 委譲を使ったAdapterパターン

それぞれを見ていく。

継承を使ったAdapterパターン

必要な処理がインタフェースにあるとき、こちらのパターンを使う。

  • Adapterは、必要な処理を持つインタフェースを実装する。
  • Adapterは、提供済みの処理を持つクラスを継承する。
    • メソッドを継承経由で使う。
  • クライアントは、必要な処理を持つインタフェース型の変数を定義する。

委譲を使ったAdapterパターン

必要な処理がクラス(含、抽象クラス)にあるとき、こちらのパターンを使う。

そうする理由は、Javaが単一継承だから、とある。クラスの形で提供される「必要な処理」をAdapterで実装するには、必要な処理があるクラスを拡張する必要がある。クラスを1つ拡張したら、Adapterはもうそれ以上他のクラスを拡張できない。しかし、Adapterのメソッド内で、別のクラスが提供済みの処理を使いたい。そこで、提供済みの処理をインスタンス経由で使う方法をとる。本では、これをフィールド経由といっている。

  • クライアントは、必要な処理を持つクラスの変数を定義する。

問題2-2は実装にライブラリを使った例

問題2-2では、必要な処理がインタフェースで提供されている。そのため、継承を使ったAdapterパターンの方になる。実装に、Javaのライブラリにあるjava.util.Propertiesのメソッドを使っているので、そういうサンプルとして学ぶことができる。

ところで、java.util.Propertiesが拡張しているjava.util.Hashtableは、Serializableを実装している。というわけで、Eclipse先生に言われるがままに、private static final long serialVersionUID を定義して初期化しておく。

第2章は、ここまで。