🦏 【Python】デザインパターン学習 - Decoratorパターン -
作成日: 2021/07/08
0

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

Decoratorパターンについて学ぶ

参考サイト1の動画で紹介されているTypeScriptのコードを自分なりにpythonに書き直して学習する。

Decoratorパターンとは

このパターンは、既存のオブジェクトに新しい機能や振る舞いを動的に追加することを可能にする(参考サイト2より)。

GoFデザインパターンの一つです。ある機能を持つクラスを拡張したい場合に継承よりも柔軟な解決を提供します。同じインターフェースを実装した別のインスタンスで包み込むように実装します。(https://techlib.circlearound.co.jp/entries/gof-decorator-pattern/)

参考サイト1もよいが、参考サイト3を見るとより詳しく理解することができる。

pythonでの書き方

class Card():
    def __init__(self,name,description):
        self.__name = name
        self.__description = description
    
    def getName(self):
        return self.__name
    
    def getDescription(self):
        return self.__description

class SRCard():
    def __init__(self,card):
        self.__card = card
    
    def getName(self):
        return "[SR]" + self.__card.getName()
    
    def getDescription(self):
        return "★★★★★★★★★★★★★★★\n" + self.__card.getDescription() + "\n★★★★★★★★★★★★★★★"

class RCard():
    def __init__(self,card):
        self.__card = card
    
    def getName(self):
        return "[R]" + self.__card.getName()
    
    def getDescription(self):
        return "---------------\n" + self.__card.getDescription() + "\n---------------"

class BossCard():
    def __init__(self,card):
        self.__card = card
    
    def getName(self):
        return "[BOSS]" + self.__card.getName()
    
    def getDescription(self):
        return self.__card.getDescription()

def showProperties(card):
    print("名前:" + card.getName())
    print("名前:\n" + card.getDescription())
    
if __name__=='__main__':
    CARDS = [
        Card("村人", "ほとんど戦力にはならない村人"),
        RCard(Card("傭兵", "金さえ出せば何でもこなす傭兵")),
        SRCard(Card("勇者", "訓練を積んだ歴戦の勇士")),
        BossCard(SRCard(Card("レッドドラゴン", "遥か昔から生き続ける火龍")))
    ]

    print("【カードゲームキャラ一覧】\n")

    for card in CARDS:
        showProperties(card)
        print("\n")

実行結果

【カードゲームキャラ一覧】

名前:村人
名前:
ほとんど戦力にはならない村人


名前:[R]傭兵
名前:
---------------
金さえ出せば何でもこなす傭兵
---------------


名前:[SR]勇者
名前:
★★★★★★★★★★★★★★★
訓練を積んだ歴戦の勇士
★★★★★★★★★★★★★★★


名前:[BOSS][SR]レッドドラゴン
名前:
★★★★★★★★★★★★★★★
遥か昔から生き続ける火龍
★★★★★★★★★★★★★★★


書いた感想としては、コンポジションになっている。
コンポジションを利用したパターンといった形で書いてある記事がないため、厳密には違うのかもしれないが、
コンストラクタでインスタンスを渡して、渡したインスタンスのメソッドを利用するところがコンポジションな気がする。

Decoratorパターンどんなときに使う?

既存のオブジェクトに機能を追加するときに使う。Decoratorパターンを使わない例だと継承でその機能を持ったクラスを作るという方法があるが、その方法だと同じような細かいクラスがドンドン増えていってしまう。そんなときDecoratorパターンを使って書くとスッキリ書くことができる。

書いたコード

github

参考サイト

  1. youtube:抽象クラス【コードで理解する】 - プログラミング相談所オンライン
  2. wiki:Decorator パターン
  3. 12. Decorator パターン

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