未来の私へ送るデザインパターン 3/24 [Adapter]
このシリーズは、この内容を忘れた未来のcacaponが読んだときに、
自力でそれを使ったプログラムが自作できることを目的として作られました~
こちらの記事は、以下を主に参考に作成しておりま…
したが、理解しにくい部分が多々出てきたので現在模索中です~
今回はGoF本を参考にしました~
残りは、cacaponの記憶の片隅にある情報がソース元になります~
また、2回書いていたのですが、書く量が多くて挫折しそうなので、
フォーマットを変えてみました~
またちょくちょく変えると思います~
Adapterってどんなやつ?
AdapterパターンはクラスAが「クラスBの何かを使いたい…でもできない!」
という時に使われるデザインパターンだそうです~
身近な例ですと、携帯の充電ケーブルがイメージしやすいですかね?
cacaponの充電器は、iPhoneなので、ケーブル自体はLightning端子?とUSB2.0?で出来ているモノを使用しています~
これだと、パソコンに刺して充電できますけど、電源プラグからは充電できませんよね?
電源プラグからも充電したい場合に使うのが、電源アダプターかと思います。
こんな感じで、
使えないものを使えるようにするための装置、というかインターフェース?
の事をアダプターというらしいです。
これをオブジェクト指向で作成する場合でも使っちゃおうということですね~
図
アダプターパターンの実現方法は2種類あるそうです~
一つはクラスに適用する場合、もう一つがオブジェクトに適用する場合だそうです~
GoF本によりますと、それぞれ特徴があってトレードオフがあるそうです~ 気になった部分だけ書くと…
- クラスに適用する有場合は、具象クラスのAdapterにインターフェースを使えるようにする処理を任せるので、
サブクラス全体に適用する場合はうまく行かないらしいです。 その代わり、オーバーライドするのは簡単らしいです~ - オブジェクトに適用する場合は、Adapteeクラスのふるまいをオーバーライドするのが難しいそうです~ その代わり、サブクラスも含めた適用を行う場合は比較的簡単にできるっぽいです~
要はケースバイケースですかね?奥が深いです~
今回は、先に紹介した図のうち、 具体例はこちら
実装については下記リンクを参考に作り直しました~
## pythonでの実装例
オブジェクトに適用する場合に沿った実装をしてみたいと思います~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端子の場合の処理をどこに書けばいいか分かりませんでした…
ん~まだまだ自在に扱えるまでには時間がかかりそうです~