アマチュアSEの勉強ブログ

アマチュアSEと一緒に勉強しましょ

デザインパターン(GoF)/Adapter

本記事ではデザインパターン「Adapter」について勉強していきましょう!



【ゴール】

「Adapterって〇〇のことで、〇〇な時に利用するんだ!」といえるようになること!

 

さて、ポイントはこの3つ!

  • GoFが作成したデザインパターンのうちの一つ
  • 電子機器であるアダプターと同じ役割
  • 既存クラスに修正を加えることなく、インターフェースを変更させることができる

この3つのポイントについて解説していきます!

デザインパターンとは?

JavaC++C#などのオブジェクト指向言語よく使われる設計をパターン化したものデザインパターンといいます。

本記事のタイトルにもある「GoF」というのは、このデザインパターンを作成した4人組のことで、彼らは全23パターンに分けています。

GoFの全23パターン

  • Template Method
  • Singleton
  • Adapter
  • Factory Method
  • Facade
  • Iterator
  • Abstract Factory
  • Bridge
  • Builder
  • Chain of Responsibility
  • Command
  • Composite
  • Decorator
  • Flyweight
  • Interpreter
  • Mediator
  • Mement(Snapshot)
  • Observer
  • Prototype
  • Proxy
  • State
  • Strategy
  • Visitor

本日はこの中から、「Adapter」をご紹介します。

Adapterとは?

Adapterとは、GoFが作成したデザインパターン23個のうちの1つで、

  • 既存のクラスに対して
  • 修正を加えることなく、
  • インターフェースを変更させる

ための設計パターンです。なんのこっちゃ?ですね。

物に例えていうと・・・

f:id:amateurSE:20210830175204p:plain
スマートフォンを充電したい!スマートフォンをコンセントに繋げるためには、このライトニングケーブルは先がUSBだから繋げらんないか・・・USBじゃなくてプラグになってるケーブルを買わなきゃいけないのか・・・」
f:id:amateurSE:20210830175143p:plain
「いや、アダプターがあればUSBもコンセントに繋げられる!!」
ということです。つまり、冒頭の文章を置き換えると下記のようになります。

  • 既存のクラス(ライトニングケーブル)を
  • 修正(先がUSBじゃなくてプラグになっている物に変更)することなく、
  • インターフェースを変更させる(USBをアダプターを使ってプラグに繋げる

わかりましたか??
しれっと、「アダプターを使って」という言葉を入れましたが、インターフェースを変更させるためには、スマホの例のように、新たに「クラス(これをアダプタークラスと呼ぶ)」を作成することで実現します。



Adapterを適用してみる

理解するために上の章で言った文章に沿って話していきます。

  • 既存のクラス(Productクラス・ProductPriceクラス)に対して
  • 修正を加えることなく、
  • インターフェースを変更させる(getCost()ではなく、getPrice()というメソッド名でモノの値段を取得したい

ということをしていきます。
まずは既存のクラスのサンプルプログラム。

class Product{
        private int cost;           // モノの値段
        public int getCost(){
                return cost;         // 値段を取得するメソッド
        }
}
interface ProductPrice{
        public int getPrice();    //このメソッドで、costを取得したい
}

getPrice()でcost取得したい。そこで新たにAdapterクラスを作成します。
Adapterクラスの作成方法として2つあります。

  1. 継承を利用した手法
  2. 委譲を利用した手法

1.継承を利用した手法

Adapterクラスのサンプルプログラムになります。

class Adapter extends Product implements ProductPrice{
  public int getPrice(){
    return this.getCost();
  }
}

こうすることで、既存クラスを修正することなく、getPrice()でgetCost()を呼び出し、costを取得することが出来ました。

Adapterのクラス図
f:id:amateurSE:20210830192333p:plain
Adapterクラス図(継承)

2.委譲を利用した手法

Adapterクラスのサンプルプログラムになります。

class ProductAdapter implements ProductPrice{
  private Product product = new Product();
  public int getPrice(){
    return product.getCost();
  }
}

こうすることで、既存クラスを修正することなく、getPrice()でgetCost()を呼び出し、costを取得することが出来ました。

Adapterのクラス図
f:id:amateurSE:20210830192415p:plain
Adapterクラス(委譲)

※implemensではなく、extendsでも大丈夫です。

Adapterの利用シーン

  • 関連性のないクラス通しを既存のクラスを変えずに関連付けする場合
  • 既存のクラスをある新しいインターフェイスを通じて再利用したい場合
  • 既存のクラス・インターフェイスをアプリケーション固有なものに(使いやすく)したい場合

まとめ

今回は、デザインパターンである「Adapter」について勉強しました。いかがでしたでしょうか?

「Adapter」について聞かれたときは、下記を言えるようになりましょう!

 >>
Adapterは、GoFが作成したデザインパターンのうちの一つで
既存クラスに修正を加えることなく、インターフェースを変更させる設計パターンのこと