【Java】Adapterパターン(継承)【デザインパターン】
目次
Adapterパターンについて
Adapterパターンとは
- "すでに提供されているもの"がそのまま使えない時に、"必要なもの"とのずれを埋めて、利用できるようにするためのデザインパターンです
- Wrapper(包む)パターンと呼ばれることもあります
- クラスによるAdaoterパターン(継承)と、インスタンスによるAdapterパターン(委譲)があります
クラスによるAdaoterパターン(継承)
サンプルプログラム
- Adaoterパターンを使って、与えられた文字列を()や*で括る例を取り上げます
- 各クラスとインターフェースの役割は以下のようになっています
- ()にACアダプターが交流100Vを直流12Vに変換する例を示しています
名前 | 役割 |
---|---|
Bannerクラス | 提供されているもの(例:交流100V) |
PrintBannerクラス | 変換装置(例:アダプター) |
Printインターフェース | 必要なもの(例:直流12V) |
Bannerクラス
- あらかじめ提供されているクラスです
public class Banner { private String string; public Banner(String string) { this.string = string; } public void showWithParen() { //文字列を()で括る System.out.println("(" + string + ")"); } public void showWithAster() { //文字列を**で括る System.out.println("*" + string + "*"); } }
Printインターフェース
- 必要とされているものを表します
public interface Print { public abstract void printWeak(); public abstract void printStrong(); }
PrintBannerクラス
- 提供されているものと、必要なものの間を埋めるアダプターの役割を担います
- Bannerクラスのメソッド(showWithParen、showWithAster)を継承し、要求されているPrintインターフェースを実装します(printWeak、printStrong)
public class PrintBanner extends Banner implements Print { public PrintBanner(String string) { super(string); } public void printWeak() { showWithParen(); } public void printStrong() { showWithAster(); } }
Mainクラスで動作確認
- アダプターの役割であるPrintBannerクラスを呼んで文字列を()で括る(=弱く)、**で括る(=強く)操作を行います
- ここで、
Print p = new PrintBanner("Hello");
のようにPrintBannerのインスタンスをPrintインターフェース型に代入しています - つまり、PrintインターフェースのprintWeakとprintStrongを使ってプログラミングをしています
public class Main { public static void main(String[] args) { Print p = new PrintBanner("Hello"); p.printWeak(); p.printStrong(); } }
Adaoterパターン(継承)のメリット
- MainクラスからはBannerクラス、showWithParen、showWithAsterメソッドは見えなくなっています
- →MainクラスはPrintBannerクラスがどんな実装をされているかを知らずとも、必要なものが手に入ります
- →Mainを変更しなくても、PrintBannerクラスの実装を変更できることになります
今日のポイント
- Adaoterパターン(Wrapperパターン)は、"すでに提供されているもの"がそのまま使えない時に、"必要なもの"とのずれを埋めて、利用できるようにするためのデザインパターンです
- クラスによるAdaoterパターン(継承)と、インスタンスによるAdapterパターン(委譲)があります
- ACアダプターが交流100Vを直流12Vに変換する、ようなイメージです
- Mainクラスからは"提供されているもの"は見えなくなっています
- Mainを変更しなくても、Adapterの実装を変更できるようになっています
本日もお疲れ様です😊