🐘
【Python】デザインパターン学習 - Adapterパターン -
作成日:
2021/10/23
0
Adapterパターンについて学ぶ
参考サイト1の動画で紹介されているTypeScriptのコードを自分なりにpythonに書き直して学習する。
Adapterパターンとは
既存のクラスがデータの形式が合わず使えないとき、Adapterを使用して形式を合わせて使えるようにするパターン。
pythonでの書き方
from abc import ABCMeta, abstractmethod
class BookShelf(metaclass=ABCMeta):
@abstractmethod
def books(self):
pass
class BookReader(metaclass=ABCMeta):
@abstractmethod
def read(self):
pass
class BookShelf(BookShelf):
def __init__(self,reader:BookReader):
self.reader = reader
def books(self):
return self.reader.read()
def printBooks(self):
print('-----------')
for book in self.books():
print(book["title"] + "/著者:" + book["author"])
class JsonBookReader(BookReader):
def read(self):
return [
{'title':'坊ちゃん','author':'夏目漱石'},
{'title':'人間失格','author':'太宰治'},
{'title':'走れメロス','author':'太宰治'}
]
class CsvBookReader():
def readCsv(self):
return [
['夏目漱石','坊ちゃん'],
['太宰治','人間失格'],
['太宰治','走れメロス']
]
class CsvBookReaderAdapter(BookReader):
def __init__(self,csvBookReader:CsvBookReader):
self.csvBookReader = csvBookReader
def read(self):
return list(map(lambda x:{'title':x[1],'author':x[0]},self.csvBookReader.readCsv()))
BOOK_SHELF1 = BookShelf(JsonBookReader())
BOOK_SHELF1.printBooks()
BOOK_SHELF2 = BookShelf(CsvBookReaderAdapter(CsvBookReader()))
BOOK_SHELF2.printBooks()
実行結果
-----------
坊ちゃん/著者:夏目漱石
人間失格/著者:太宰治
走れメロス/著者:太宰治
-----------
坊ちゃん/著者:夏目漱石
人間失格/著者:太宰治
走れメロス/著者:太宰治
書いた感想
CsvBookReaderAdapterで形式を合わせることで、CsvBookReaderの値も既存のクラスで出力できるようになった。既存のクラスに手を入れることができない状況でどうにかしなければならないときに使えそう。これは実践的なパターンで覚えておいて損はないと思った。
書いたコード
参考サイト
フリーランスでpythonエンジニアとして働きたく勉強中。
前職は運用SEとセキュリティエンジニア。
開発は学校で学んだ経験と趣味でやっていた程度。一応前職でも業務の自動化のためにExcel VBAやセキュリティテスト用のWebサイトの開発やセキュリティテストツールの改良などで開発はやっていた。