第2章 Adapter - 増補改訂版Java言語で学ぶデザインパターン入門
この本の第2章は、私が知る限り、もっとも分かりやすく「委譲とは何か」を説明してると思います。結城さんの説明、好きだー。
さて、というわけで、Adapterパターンの復習メモ。
Adapterパターンでは、すでに提供されているクラスに手を加えずに、必要なインタフェースを用意できる、とあります。また、使う側(クライアント)のコードを変えずに、Adapterが継承した「提供されているクラス」内部の実装を変更をできます。
Adapterパターンとして、2種類の実装が紹介されている。
- 継承を使ったAdapterパターン
- 委譲を使ったAdapterパターン
それぞれを見ていく。
継承を使ったAdapterパターン
必要な処理がインタフェースにあるとき、こちらのパターンを使う。
- Adapterは、必要な処理を持つインタフェースを実装する。
- Adapterは、提供済みの処理を持つクラスを継承する。
- メソッドを継承経由で使う。
- クライアントは、必要な処理を持つインタフェース型の変数を定義する。
- Adapterのインスタンスを代入して使う。
委譲を使ったAdapterパターン
必要な処理がクラス(含、抽象クラス)にあるとき、こちらのパターンを使う。
そうする理由は、Javaが単一継承だから、とある。クラスの形で提供される「必要な処理」をAdapterで実装するには、必要な処理があるクラスを拡張する必要がある。クラスを1つ拡張したら、Adapterはもうそれ以上他のクラスを拡張できない。しかし、Adapterのメソッド内で、別のクラスが提供済みの処理を使いたい。そこで、提供済みの処理をインスタンス経由で使う方法をとる。本では、これをフィールド経由といっている。
- Adapterは、必要な処理を持つクラスを拡張する。
- 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章は、ここまで。