デザインパターン[GoF 23]#2 Adapterパターン

こんにちは!ぐちです。

〜ぼっちAdvent Calendar風イベント実施中[10日目]〜

今回は下記の記事で投稿したデザインパターンの二つ目をご紹介したいと思います。

Adapterパターン

Adapterという単語は日本語でいうと「適合させる」です。デザインパターンでもそのままの意味でして、互換性のないインターフェースを持つメソッド間の差異を埋めるようなものをAdapterパターンといいます。AdapterクラスはWrapperと呼ばれることもあります。

Adapterパターンには2通りの方法がありまして、継承を利用したパターンと委譲を利用したパターンです。

実際にコードを見てもらったほうがお分かりいただけると思うので(理解度の低さから説明を逃げるという。。。)さっそく下記のコードをどうぞ!笑

委譲を利用したパターン

public interface Target {
     public abstract String getXxx();
}
public class Adaptee {
     public String getXyy() {
          return "Xyy";
     }
}
public class Adapter extends Adaptee implements Target {
     @Override
     public String getXxx() {
          String ret = getXyy();
          return ret.replaceAll("y", "x");
     }
}
public class Main {
     public static void main(String[] args) {
          Target target = new Adapter();
          System.out.println(target.getXxx());
     }
}

Adapterクラスが今回のデザインパターンの肝になるのですが、Adapteeクラスは実績のある既存の処理を持っておりまして、それを使って今回実現したい機能を実装するのが一番手っ取り早いので、上記のようにしています。今回実現したい処理以外は実績のある処理を使うことができるので生産効率は高くなりますよね。

継承を利用したパターン

AdapterクラスでインプリメントしているTargetクラスがinterfaceではなく抽象クラスで実装されていた場合を想定すると、Adapterクラス内でインスタンス変数として保持すればいいわけです。

public class Adapter extends Target {
     private Adaptee adaptee;

     public Adapter() {
          adaptee = new Adaptee();
     }

     @Override
     public String getXxx() {
          String ret = adaptee.getXyy();
          return ret.replaceAll("y", "x");
     }
}

結局のところ

正直僕もよくわかってないんです。笑
ただ、wrapperクラスを用いて影響範囲を局所的にする手法はよく使われていることなので、そういうことなんだと思います。

今回はパターンのひとつですよ的な紹介になっちゃいましたね。まだまだ勉強が必要ですな。

サンプルコード

GitHubにアップしていますのでご自由にお使いください。

では今回はこの辺で。

2016年振り返り

以前の投稿でもちらっと紹介しましたが、今年はボードゲームを知る機会に恵まれました。ライトなカードゲームから、かなり本気のボードゲームまで様々なゲームを紹介してもらいました。普段は外で遊ぶことが多い(小学生かっ!!)ので、これまであまり身近ではなかったのですがいざプレイしてみると意外と楽しいんですよね!今月には会社のボドゲ好きが集まって盛大にプレイする会が催されるようですので非常に楽しみにしています。

新しいことを学ぶ(知る)って素晴らしいですね!!

ぼっちAdvent Calendar風ルール

  • 1日1記事更新する
  • 記事内に1年間の出来事の振り返りを1つ明記する
  • 1日の期間は起きてから寝るまで(時刻ではない)

ぼっちAdvent Calendar風イベントとは?下記の記事をご覧ください。