🐉 【Python】デザインパターン学習 - Facadeパターン -
作成日: 2021/07/12
0

注意)このTicketはあくまで自分用のメモ。厳密な定義などは参考サイトを参照のこと

Facadeパターンについて学ぶ

今回は参考サイト1でコードを紹介していなかったので、参考サイト2のJavaのコードを自分なりにpythonに書き直して学習する。

Facadeパターンとは

読み方:ファサードパターン

Facadeパターンは、既存のクラスを複数組み合わせて使う手順を、「窓口」となるクラスを作ってシンプルに利用できるようにするパターンです。(参考サイト2より引用)

詳細は参考サイト1の解説が分かりやすいのでそれを参照。

pythonでの書き方

#所蔵本リスト
class BookList():
    def __init__(self):
        self.BOOKS = {"昆虫図鑑":"A-3","怪獣図鑑":"B-2","植物図鑑":"C-1","鉱物図鑑":"D-4"}

    def searchBook(self,bookName):
        #本の名前から探す
        #あればその場所を、なければNoneを返す
        if bookName in self.BOOKS:
            location = self.BOOKS[bookName]
        else:
            location = None

        return location

#貸出帳
class LendingList():
    def __init__(self):
        self.BOOKS = ["怪獣図鑑","鉱物図鑑"]
    
    def check(self, bookName):
        #貸出帳をチェックする
        #貸出中ならtrue,そうでなければfalseを返す
        if bookName in self.BOOKS:
            return True
        else:
            return False

#図書委員の中村くん
class Librarian():
    def searchBook(self,bookName):
        #本を探す
        bookList = BookList()
        location = bookList.searchBook(bookName)

        #本の場所がNoneではない(所蔵してる)とき
        if location is not None:
            #貸出中かチェックする
            lendingList = LendingList()
            if lendingList.check(bookName):
                #貸出中のとき
                return "貸出中です"
            else:
                return location
        #所蔵してないとき
        else:
            return "その本は所蔵していません"

class Visitor():
    def __init__(self,bookName):
        self.bookName = bookName

    def reaction(self):
        #窓口の中村くんを作る
        nakamura = Librarian()
        #中村くんに本の場所を聞く
        location = nakamura.searchBook(self.bookName)
        if location == "貸出中です":
            return "貸出中かよ・・・"
        elif location == "その本は所蔵していません":
            return "なんだ、ないのか"
        else:
            return location + "ね。分かった、サンキュ!"

if __name__=='__main__':
    yamada = Visitor("昆虫図鑑")
    print(yamada.reaction())

    tanaka = Visitor("鉱物図鑑")
    print(tanaka.reaction())

    sudou = Visitor("惑星図鑑")
    print(sudou.reaction())

実行結果

A-3ね。分かった、サンキュ!
貸出中かよ・・・
なんだ、ないのか

書いた感想

LibrarianクラスがFacadeパターンを適用したクラス。
VisitorクラスがFacadeパターンの窓口を利用するクラス。
窓口を設けることで複雑な処理を呼び出す側は意識しないで利用できていい。

Facadeパターン どういったときに使う?

複数のクラスに跨った処理を一つにまとめたいときに利用する。
一つの処理として実行する窓口となるクラスを作る。
窓口クラスのインスタンスを生成してメソッドを呼び出すだけで利用できる。
使いまわす必要があるときはより効果を発揮しそう。

書いたコード

github

参考サイト

  1. youtube:Facadeパターン【概念解説】- プログラミング相談所オンライン
  2. 15.Facadeパターン
  3. wiki:Facade パターン
フリーランスでpythonエンジニアとして働きたく勉強中。 前職は運用SEとセキュリティエンジニア。 開発は学校で学んだ経験と趣味でやっていた程度。一応前職でも業務の自動化のためにExcel VBAやセキュリティテスト用のWebサイトの開発やセキュリティテストツールの改良などで開発はやっていた。