【Python デザインパターン】Adaptorパターン(継承)

Pythonで学ぶデザインパターン

Adaptorパターン

Adaptorパターンではインターフェイスが異なるものの間に入って、

異なるものの間のずれを調整する変換装置的役割を担います。

別名Wrapperパターンと呼びます。

 

 

サンプルプログラム

1000円をユーロもしくはドルに変換する両替機のサンプルコードを見てみましょう。

クラス図

adaptor

提供されている者

ドル円レート(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パターンには委譲を使った方法もあります。

 

 

あわせて読みたい