🐘 【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の値も既存のクラスで出力できるようになった。既存のクラスに手を入れることができない状況でどうにかしなければならないときに使えそう。これは実践的なパターンで覚えておいて損はないと思った。

書いたコード

github

参考サイト

  1. Adapterパターン【コードで理解する】- プログラミング相談所オンライン

フリーランスでpythonエンジニアとして働きたく勉強中。 前職は運用SEとセキュリティエンジニア。 開発は学校で学んだ経験と趣味でやっていた程度。一応前職でも業務の自動化のためにExcel VBAやセキュリティテスト用のWebサイトの開発やセキュリティテストツールの改良などで開発はやっていた。