Index
以下の本です。
会社の上司にjava中級者必読と言われたので読み始めました。
本書では以下のように説明されています。
「すでに提供されているもの」と「必要としているもの」の間のずれを埋めてめてくれるようなデザインパターン
例えば、直流12ボルトで動くノートパソコンを交流100ボルトのAC電源につなぐ時に変換してくれるのがACアダプターです。
このACアダプターのような役割を果たすのがAdapterパターンといいます。
別名Wrapperパターンというそうです。(本記事ではAdapterパターンということにします)
Adapterパターンのメリットは
- 既存のクラスを使いまわせるので、必要なメソッド群を素早く作れる
- 使いまわしたメソッドにはバグがないことがわかっているので、テストが楽
サンプルプログラムを見た後に、メリットを再確認してみましょう。
- クラスによるAdapterパターン(継承を使ったもの)
- インスタンスによるAdapterパターン(移譲を使ったもの)
Adapterされるクラス。元々用意されていたクラス。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class PrintAdaptee { private final String string; public PrintAdaptee(String string) { this.string = string; } public void printOmoji() { System.out.println(string.toUpperCase()); } public void printKomoji() { System.out.println(string.toLowerCase()); } } |
PrintAdapteeクラスをこのクラスの形で使えるようにしたい。
1 2 3 4 |
public interface Print { public abstract void printUpperCase(); public abstract void printLowerCase(); } |
Printクラスで定義された形でPrintAdapteeクラスを使えるようにしたクラス。
Adapterパターンで重要なクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class PrintAdapter extends PrintAdaptee implements Print { public PrintAdapter(String string) { super(string); } @Override public void printUpperCase() { printOmoji(); } @Override public void printLowerCase() { printKomoji(); } } |
MainクラスはPrintAdapteeクラスの存在を知らないように設計されている。
美しいですね。
1 2 3 4 5 6 7 |
public class Main { public static void main(String[] args) { Print p = new PrintAdapter("MoJi"); p.printLowerCase(); p.printUpperCase(); } } |
変更点あまり多くありません
1 2 3 4 |
public abstract class Print { public abstract void printUpperCase(); public abstract void printLowerCase(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class PrintAdapter implements Print { private PrintAdaptee adaptee; public PrintAdapter(String string) { this.adaptee = new Adaptee(string); } @Override public void printUpperCase() { adaptee.printOmoji(); } @Override public void printLowerCase() { adaptee.printKomoji(); } } |
これは一目瞭然ですね。
Adapteeクラスに欲しい実装がありますので、PrintAdapterクラスであたらに実装することは何もありません。
例えばPrintUpperCase()メソッドで改行を増やしたい場合は
1 2 3 4 |
public void printUpperCase() { adaptee.printOmoji(); System.out.Println(); } |
このように書けば良いです。
この時改行に不具合があればprintOmoji()メソッドにバグがないことが分かっていれば、テストが楽ですね 🙂
今回はAdapterパターンについて学んでみました。
何か間違っているとかあればコメントで教えていただきたいです。
またデザインパターンの記事は他にもありますので、見ていただけると嬉しいです。