未来の私へ送るデザインパターン 3/24 [Adapter]

このシリーズは、この内容を忘れた未来のcacaponが読んだときに、
自力でそれを使ったプログラムが自作できることを目的として作られました~

こちらの記事は、以下を主に参考に作成しておりま…
したが、理解しにくい部分が多々出てきたので現在模索中です~

www.techscore.com

今回はGoF本を参考にしました~

オブジェクト指向における再利用のためのデザインパターン
エリック ガンマ ラルフ ジョンソン リチャード ヘルム ジョン ブリシディース
ソフトバンククリエイティブ
売り上げランキング: 18,655

残りは、cacaponの記憶の片隅にある情報がソース元になります~

また、2回書いていたのですが、書く量が多くて挫折しそうなので、
フォーマットを変えてみました~

またちょくちょく変えると思います~

Adapterってどんなやつ?

AdapterパターンはクラスAが「クラスBの何かを使いたい…でもできない!」
という時に使われるデザインパターンだそうです~

身近な例ですと、携帯の充電ケーブルがイメージしやすいですかね?
cacaponの充電器は、iPhoneなので、ケーブル自体はLightning端子?とUSB2.0?で出来ているモノを使用しています~
これだと、パソコンに刺して充電できますけど、電源プラグからは充電できませんよね?
電源プラグからも充電したい場合に使うのが、電源アダプターかと思います。

f:id:cacapon:20200214183158p:plain

こんな感じで、
使えないものを使えるようにするための装置、というかインターフェース?
の事をアダプターというらしいです。
これをオブジェクト指向で作成する場合でも使っちゃおうということですね~


アダプターパターンの実現方法は2種類あるそうです~
一つはクラスに適用する場合、もう一つがオブジェクトに適用する場合だそうです~

f:id:cacapon:20200214183222p:plain

GoF本によりますと、それぞれ特徴があってトレードオフがあるそうです~ 気になった部分だけ書くと…

  • クラスに適用する有場合は、具象クラスのAdapterにインターフェースを使えるようにする処理を任せるので、
    サブクラス全体に適用する場合はうまく行かないらしいです。 その代わり、オーバーライドするのは簡単らしいです~
  • オブジェクトに適用する場合は、Adapteeクラスのふるまいをオーバーライドするのが難しいそうです~ その代わり、サブクラスも含めた適用を行う場合は比較的簡単にできるっぽいです~

要はケースバイケースですかね?奥が深いです~


## pythonでの実装例

今回は、先に紹介した図のうち、
オブジェクトに適用する場合に沿った実装をしてみたいと思います~

具体例はこちら

f:id:cacapon:20200214183345p:plain

実装については下記リンクを参考に作り直しました~

pythonによるデザインパターン[Adapter] - Since I want to start “blog” that looks like men do, I do start. - Medium

from abc import ABCMeta, abstractmethod


def myiPhone():
    t = Cable()
    t.charge(plug='Power')


class Power():
    def __init__(self):
        pass

    def chargefromPower(self, plug):
        if plug == 'Power':
            print('電源から充電を開始します')
        else:
            print('plugが合わないので電源から充電ができませんでした')


class Adapter(metaclass=ABCMeta):
    @abstractmethod
    def charge(self):
        pass


class Cable(Adapter):
    def __init__(self):
        self.__Power = Power()

    def charge(self, plug):
        self.__Power.chargefromPower(plug)


if __name__ == '__main__':
    myiPhone()


疑問点

アダプターをかませない場合の処理ってどこにどう書けばいいんですかね?USBケーブルでしょうか??
今回だと、差し込み先を変数として渡すようにしてみたのですが、
USB端子の場合の処理をどこに書けばいいか分かりませんでした…

ん~まだまだ自在に扱えるまでには時間がかかりそうです~