概要
デザインパターンの一つAdaptorパターンの練習用の実装とそれに関するまとめを書いてみました。
サンプルプログラム
既存のクラスjava.util.Propertiesクラスを使いやすいようにFilePropertyクラスでラップし、FilePropertyクラスを利用する側にFileIOインタフェースを提供し、キーと値のマップを簡単にファイル入出力を行えるようにする。
FileIO.java
public interface FileIO {
public abstract void readFromFile(String fileName) throws IOException;
public abstract void writeToFile(String fileName) throws IOException;
public abstract void setPropertySet(String key, String value);
}
FileProperty.java
import java.io.*;
import java.util.Properties;
public class FileProperty extends Properties implements FileIO {
@Override
public void readFromFile(String fileName) throws IOException {
load(new FileInputStream(fileName));
}
@Override
public void setPropertySet(String key, String value) {
setProperty(key, value);
}
@Override
public void writeToFile(String fileName) throws IOException {
store(new FileOutputStream(fileName), "Output all property");
}
}
たったこれだけです。それではメインクラスで利用してみたいと思います。入力ファイルとして input.txt を準備。
input.txt
year=2014
month=07
day=29
Main.java
public class Main {
public static void main(String args[]) {
FileIO fileio = new FileProperty();
try {
fileio.readFromFile("input.txt");
fileio.setPropertySet("test", "1000");
fileio.setPropertySet("test2", "aiueo");
fileio.setPropertySet("test3", "???");
fileio.writeToFile("output.txt");
} catch (IOException ex) {
ex.printStackTrace();
return;
}
}
}
実行後の出力ファイルを見てみます。
output.txt
#Output all property
#Tue Jul 29 21:14:58 JST 2014
day=29
test3=???
test2=aiueo
year=2014
month=07
test=1000
ご覧の通り、input.txtに記載されていたキーと値のマップが出力ファイルに記載されています。そして、プログラム上でセットしたキーバリューも無事出力されていることがわかると思います。
まとめ
・すでに提供されているものと必要なものとのずれをうめることを目的としたデザインパターンの一つ
・実際に既存のプログラムを少し修正するだけで提供できてしまうような要求があったとき、既存のプログラムを修正することでも要件は満たせてしまうが、それは既存のプログラム再度テストしなければいけないことにつながってしまう。
・既存の部品を利用する新しい部品を作ることで、バグが発生しても新しい部品内のバグがあるということがわかっているので管理もしやすくなると考えられる。
・イメージとしては既存のプログラムを利用しやすいようなAPIを作るような感じがした。