【デザインパターン】JavaのAdapterパターンについて
今回はAdapterパターンについて解説します。
September 15, 2023 • 3 min read •
Java
デザインパターン
Adaper パターン
既存のクラスに手を加えずに用途だけを伝えるイメージです。 既存クラスを直接使おうとすると、その処理がどのようになっているのか知らなければいけませんし依存関係も深くなります。 これを防ぐために使います。今回は Java の properties クラスを用いて実際に使っていきます。
実装
FileIO インターフェース
このインターフェースのメソッドを Main クラスで使用します。 Main クラスはこれらのメソッドの引数と返り値だけ分かれば使用することができます。
java
import java.io.IOException;
public interface FileIO {
void createNewFile(String filename) throws IOException;
void readFromFile(String filename) throws IOException;
void writeToFile(String filename) throws IOException;
void setValue(String key, String value);
String getValue(String key);
}
FileProperties クラス
具体的な処理です。 Main クラスからこの処理は見えないため安全に処理を書き換えることができます。
java
import java.io.IOException;
public class FileProperties implements FileIO {
public Properties properties;
public FileProperties() {
this.properties = new Properties();
}
@Override
public void createNewFile(String filename) throws IOException {
this.properties.store(new FileOutputStream(filename));
}
@Override
public void readFromFile(String filename) throws IOException {
this.properties.load(new FileInputStream(filename));
}
@Override
public void writeToFile(String filename) throws IOException {
this.properties.store(new FileOutputStream(filename), "written by FileProperties");
}
@Override
public void setValue(String key, String value) {
this.properties.setProperty(key, value);
}
@Override
public String getValue(String key) {
return this.properties.getProperty(key);
}
}
Main クラス
具体的な処理を Main クラスから分離することができました。
java
import java.io.IOException;
public class Main {
public static void main(String[] args) {
FileIO f = new FileProperties();
try {
f.createNewFile("file.txt");
f.readFromFile("newfile.txt");
f.setValue("year", "2004");
f.setValue("month", "4");
f.setValue("day", "21");
f.writeToFile("newfile.txt");
System.out.println("newfile.txt is created.");
} catch (IOException e) {
e.printStackTrace();
}
}
実行結果
#written by FileProperties
#Fri Sep 15 15:06:23 JST 2023
day=21
month=4
year=2004
まとめ
Adapter パターンを用いることで既存のクラスを用いて用途を定義し、その実装を Main クラスから隠して利用することができました。
See you later👋
0