デザインパターン(GoF)/Adapter
本記事ではデザインパターン「Adapter」について勉強していきましょう!
【ゴール】
「Adapterって〇〇のことで、〇〇な時に利用するんだ!」といえるようになること!
さて、ポイントはこの3つ!
この3つのポイントについて解説していきます!
デザインパターンとは?
Java、C++、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つで、
- 既存のクラスに対して
- 修正を加えることなく、
- インターフェースを変更させる
ための設計パターンです。なんのこっちゃ?ですね。
物に例えていうと・・・
「スマートフォンを充電したい!スマートフォンをコンセントに繋げるためには、このライトニングケーブルは先がUSBだから繋げらんないか・・・USBじゃなくてプラグになってるケーブルを買わなきゃいけないのか・・・」
「いや、アダプターがあれば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.継承を利用した手法
Adapterクラスのサンプルプログラムになります。
class Adapter extends Product implements ProductPrice{ public int getPrice(){ return this.getCost(); } }
こうすることで、既存クラスを修正することなく、getPrice()でgetCost()を呼び出し、costを取得することが出来ました。
Adapterのクラス図
2.委譲を利用した手法
Adapterクラスのサンプルプログラムになります。
class ProductAdapter implements ProductPrice{ private Product product = new Product(); public int getPrice(){ return product.getCost(); } }
こうすることで、既存クラスを修正することなく、getPrice()でgetCost()を呼び出し、costを取得することが出来ました。
Adapterのクラス図
※implemensではなく、extendsでも大丈夫です。