【Python デザインパターン】Adaptorパターン(継承)
Adaptorパターン
Adaptorパターンではインターフェイスが異なるものの間に入って、
異なるものの間のずれを調整する変換装置的役割を担います。
別名Wrapperパターンと呼びます。
サンプルプログラム
1000円をユーロもしくはドルに変換する両替機のサンプルコードを見てみましょう。
クラス図
提供されている者
ドル円レート(Daller)
class Daller:
def __init__(self):
self._daller_yen=107
def getOneDaller(self):
return self._daller_yen
ユーロ円レート(Euro)
class Euro:
def __init__(self):
self._euro_yen=122
def getOneEuro(self):
return self._euro_yen
外貨のレートです。
このレートに沿って変換器が代わりに両替を行います。
変換装置(アダプター)
円ドル両替機
class DallerExchanger(MoneyExchanger,Daller):
def __init__(self):
super().__init__()
def yen2Original(self,yen):
print(str(yen//self.getOneDaller())+"ドル")
円ユーロ両替機
class EuroExchanger(MoneyExchanger,Euro):
def __init__(self):
super().__init__()
def yen2Original(self,yen):
print(str(yen//self.getOneEuro())+"ユーロ")
提供されるものと、必要なものの「ずれ」を埋める変換器の役割をもちます。
必要なもの
円から外貨へ変換する両替機
class MoneyExchanger:
def yen2Original(self,yen):
print(yen)
実際に必要としているものです。
今回であれば円を外貨に交換したいので、このクラスを継承し各両替機を作成します。
サンプルプログラム全般
class MoneyExchanger:
def yen2Original(self,yen):
print(yen)
class Daller:
def __init__(self):
self._daller_yen=107
def getOneDaller(self):
return self._daller_yen
class Euro:
def __init__(self):
self._euro_yen=122
def getOneEuro(self):
return self._euro_yen
class DallerExchanger(MoneyExchanger,Daller):
def __init__(self):
super().__init__()
def yen2Original(self,yen):
print(str(yen//self.getOneDaller())+"ドル")
class EuroExchanger(MoneyExchanger,Euro):
def __init__(self):
super().__init__()
def yen2Original(self,yen):
print(str(yen//self.getOneEuro())+"ユーロ")
if __name__ == '__main__':
yen = 1000
exDaller = DallerExchanger()
exEuro= EuroExchanger()
exDaller.yen2Original(yen)
exEuro.yen2Original(yen)
実際に実行してみてください。
1000円を各外貨に変換した際の金額が表示されるはずです。
このように異なるものであっても、
求められているものに対して整えてくれるアダプター(変換器)を用意することで、
容易に利用することが可能になります。
メモ
・Pythonではインターフェイスは存在しないため模倣するため多重継承を使っています。
・Adaptorパターンには委譲を使った方法もあります。