目的
以下の書籍を読んで、デザインパターンについて学習したため、その備忘録として記事を作成する。
- Java言語で学ぶデザインパターン入門 第3版 (著: 結城浩)
Adapterパターンとは
- 既に提供されているものと必要なものの間のずれを埋める変換器の役割を果たす
- (例)直流xxボルトを交流xxボルトに変換するACアダプタ
- 既存のクラスには全く手を加えずに、目的のインターフェース(API)に合わせようとするもの
2種類のAdapterパターンがある。
分類 | 具体的な使用方法 |
---|---|
クラス | 継承 |
インスタンス | 委譲 |
委譲については以下の記事が詳しい。
なぜこのデザインパターンを使うのか
- クラスを新規作成するよりも、テスト済みの既存のクラスを再利用した方がバグ発生時の調査範囲を特定しやすいため。
- 既存のクラスはテスト済みなので、バグが発生した時は、再利用先のクラス(Adapter)側を調べれば良い。
実際に使ってみる
練習問題2-2を解く。(委譲パターンで解く)
- Target:
FileIO
- Adapter:
FileProperties
- Adaptee:
Properties
(java.util.Properties
)
サンプルコード
- Target
FileIO.java
package Adapter;
import java.io.IOException;
public interface FileIO {
public void readFromFile(String fileName) throws IOException;
public void writeToFile(String fileName) throws IOException;
public void setValue(String key, String value);
public String getValue(String key);
}
- Adapter
FileProperties.java
package Adapter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class FileProperties implements FileIO {
Properties p = new Properties();
@Override
public void readFromFile(String fileName) throws IOException {
p.load(new FileReader(fileName));
}
@Override
public void writeToFile(String fileName) throws IOException {
p.store(new FileWriter(fileName), "written by FileProperties");
}
@Override
public void setValue(String key, String value) {
p.setProperty(key, value);
}
@Override
public String getValue(String key) {
return p.getProperty(key, "");
}
}
- 実行用
Main.java
package Adapter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
FileIO f = new FileProperties();
try {
f.readFromFile("Adapter/file.txt");
f.setValue("width", "1024");
f.setValue("height", "512");
f.setValue("depth", "32");
f.writeToFile("newfile.txt");;
System.out.println("newfile.txt is created");
} catch (IOException e) {
e.printStackTrace();
}
}
}
メリット
- AdapterではAdapteeのメソッドをまるっと利用(委譲)しているだけなので、エラーが発生した場合はAdapter側のクラスが問題であることがわかる。
- => エラー箇所の切り分けがしやすい
- 実装を修正したい場合、Adapterクラスの修正だけで済み、Adaptee側のクラスを意識する必要がない。
感想
- 練習問題で解いたように、Adaptee側にJavaの標準ライブラリを使った場合は、バグの範囲が絞りやすいので今後使っていきたい。
- 委譲のおかげで「以上」の変換がしにくくなった。。
以上