mohuneko’s blog

かんばる駆け出しエンジニアのブログです

【Java】Adapterパターン(委譲)【デザインパターン】

駆け出しエンジニアがデザインパターンをもくもく勉強します

 こんな本で勉強しています🌟

目次

Adapterパターンについて

Adapterパターンとは

  • "すでに提供されているもの"がそのまま使えない時に、"必要なもの"とのずれを埋めて、利用できるようにするためのデザインパターンです
  • Wrapper(包む)パターンと呼ばれることもあります
  • クラスによるAdaoterパターン(継承)と、インスタンスによるAdapterパターン(委譲)があります

インスタンスによるAdaoterパターン(委譲)

  • 委譲とは、あるメソッドの処理を他のインスタンスのメソッドに任せることです

サンプルプログラム

  • Adaoterパターンを使って、与えられた文字列を()や*で括る例を取り上げます
  • 各クラスの役割は以下のようになっています
  • ()にACアダプターが交流100Vを直流12Vに変換する例を示しています
名前 役割
Bannerクラス(Adaptee) 提供されているもの (例:交流100V)
PrintBannerクラス(Adapter) 変換装置 (例:アダプター)
Printクラス(Target) 必要なもの (例:直流12V)
Manクラス(Client) 必要なものを使って仕事を行う
(例:直流12Vで動くノートパソコン)

f:id:mohuNeko:20201227110106p:plain

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 abstract class Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

PrintBannerクラス

  • 提供されているものと、必要なものの間を埋めるアダプターの役割を担います
  • bannerフィールドでBannerクラスのインスタンスを保持します
    • PrintBannerクラスのコンストラクタで生成しています
  • printWeak、printStringメソッドではbannerフィールドを介してshowWithPare、showWithAsterメソッドを呼びます
  • 継承するのではなく、フィールド経由で呼び出している、ということです
  • printWeakを実行する時に、自分で処理するのではなく、BannerインスタンスのshowWithParenメソッドに委譲しています
public class PrintBanner extends Print {
    private Banner banner;
    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }
    public void printWeak() {
        banner.showWithParen();
    }
    public void printStrong() {
        banner.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パターン(委譲)のメリット

  • 既存のクラスに一皮被せて、必要とするクラスを作ることで、必要なメソッドを素早く作ることができます
  • 既存のクラスを修正することなく、必要なクラスを作ることで、再利用し易く、バージョンの互換性を高めることができます
  • 既存のクラスにはバグがないと分かっていれば、Adapterのデバッグに集中して行えば良いため、開発や改修がし易くなります

今日のポイント

  • Adaoterパターン(Wrapperパターン)は、"すでに提供されているもの"がそのまま使えない時に、"必要なもの"とのずれを埋めて、利用できるようにするためのデザインパターンです
  • クラスによるAdaoterパターン(継承)と、インスタンスによるAdapterパターン(委譲)があります
  • 委譲とは、あるメソッドの処理を他のインスタンスのメソッドに任せることです
  • アダプターのフィールドで、提供されている (Bannerクラス) インスタンスを保持することで、提供されているメソッドをフィールド経由で呼びます
  • アダプターのメソッドを実行する時に、自分で処理するのではなく、提供されているメソッドに処理を委譲しています
  • クラスによるAdapterパターンでは、Adapterは継承を使ってAdapteeを利用します
  • インスタンスによるAdapterパターンでは、委譲を使ってAdapteeを利用します

 本日もお疲れ様です😊