Adapterパターン
Adapterパターンは、あるクラスのメソッドと呼び出し側の間を受け持つちょうどアダプターとなる役割を果たすクラスを作成するデザインパターンです。
自分なりにAdapterパターンをクラス図にまとめてみました。
Adapterパターンには「継承」を利用したものと「委譲」を利用したものがあります。まずは、継承を利用したものから見ていきます。
Adapterパターン(継承)のクラス図
Adapterパターン(継承)の解説
Adapteeクラスはすでに作成されているクラスだとします。
また、ClientクラスではTargetインターフェースで定義されているadapterMethodというメソッドを呼び出すことになっているとします。このadapterMethodの処理で、AdapteeクラスのoriginalMethodを使用したい場合に、Targetを実装しているAdapterクラスのadapterMethodで呼び出してあげることで、Client側はAdaptee側の実装を意識せずにoriginalMethodを呼び出すことができます。こうすることで、AdapteeとClientの結合を緩くすることができます。
Adapterパターン(委譲)のクラス図
Adapterパターン(委譲)の解説
継承の場合とほとんど同じですが、AdapterクラスがAdapteeのoriginalMethod()を呼び出す方法が違っています。
AdapterクラスにAdaptee型の属性をもたせ、その属性のoriginalMethodを呼び出しています。
Adapterパターンをどういう場合に使うか
すでにAdapteeクラスのようなクラスが存在しているときに、別のクラスで実装している処理から、Adapteeのメソッドを呼び出したい場合に使用できます。
直接呼び出せば良い気もしますが、処理をちょっと変えたいとなった場合にすでに実装しているAdapteeクラスを変更するのは他への影響を考えて行いたくないことがあります。このような場合にAdapterクラスでその変更を行えば、既存のクラスを変更する必要がなくなります。
このように、あるクラスのメソッドと呼び出し側のちょうどアダプターとなる役割を果たすクラスを作成するのがアダプターパターンです。
PlantUMLでAdapterパターンのクラス図を記述する
Adapterパターンのクラス図をPlantUMLで書いたときのソースです。
継承を利用したAdapterパターン
@startuml Adapter
interface Target{
+ abstract adapterMethod()
}
class Adaptee{
+ originalMethod()
}
class Adapter extends Adaptee implements Target{
+ adapterMethod() //super.originalMethod()を呼び出す
}
class Client{
}
Client --> Target : uses >
@enduml
委譲を利用したAdapterパターン
@startuml Adapter
interface Target{
+ abstract adapterMethod()
}
class Adaptee{
+ originalMethod()
}
class Adapter implements Target{
- adaptee : Adaptee
--
+ adapterMethod() //this.adaptee.originalMethod()を呼び出す
}
class Client{
}
Adapter o-u-> Adaptee
Client --> Target : uses >
@enduml
参考サイトURL
Adapter パターン – Wikipedia
PHPによるデザインパターン入門 – Adapter〜APIを変更する