mohuneko’s blog

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

【Java】Adapterパターン(継承)【デザインパターン】

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

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

目次

Adapterパターンについて

Adapterパターンとは

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

クラスによるAdaoterパターン(継承)

サンプルプログラム

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

f:id:mohuNeko:20201227101106p: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 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の実装を変更できるようになっています

 本日もお疲れ様です😊