🦓 【Python】デザインパターン学習 - Chain of Responsibilityパターン -
作成日: 2021/11/07
0

Chain of Responsibilityパターンについて学ぶ

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

Chain of Responsibilityパターンとは

処理するオブジェクトを数珠つなぎにして順次処理させる方法。

pythonでの書き方

from abc import ABCMeta, abstractmethod


class LoggerBase(metaclass=ABCMeta):
    info = 0
    error = 1
    next = None

    def setNext(self, next):
        self.next = next
        return next
    
    @abstractmethod
    def call(self,message: str, loggerType: int):
        pass


class Logger(LoggerBase):

    def call(self, message: str, loggerType: int):
        if loggerType == self.info:
            print('Logger:',message)
        
        if self.next:
            self.next.call(message, loggerType)


class FileLogger(LoggerBase):

    def call(self, message: str, loggerType: int):
        if loggerType == self.error:
            print('FileLogger:', message)
        
        if self.next:
            self.next.call(message, loggerType)


class ErrorHandler:
    next = None

    def setNext(self, next):
        self.next = next
        return next

    def call(self, *args):
        try:
            if self.next:
                self.next.call(*args)
        except Exception as e:
            print(e)


class SlackNotifer(LoggerBase):
    
    def call(self, *args):
        if args[1] == self.error:
            print('Slack:', args[0])

        if self.next:
            self.next.call(*args)


LOGGER = Logger()
FILE_LOGGER = FileLogger()

LOGGER.setNext(FILE_LOGGER)
LOGGER.call('コンソールに出力されるログです', 0)
LOGGER.call('重大なエラーが発生しました', 1)

ROOT = ErrorHandler()
SLACK_NOTIFER = SlackNotifer()

ROOT.setNext(LOGGER).setNext(FILE_LOGGER).setNext(SLACK_NOTIFER)

ROOT.call('コンソールに出力されるログです', 0)
ROOT.call('重大なエラーが発生しました', 1)

実行結果

Logger: コンソールに出力されるログです
FileLogger: 重大なエラーが発生しました
Logger: コンソールに出力されるログです
FileLogger: 重大なエラーが発生しました
Slack: 重大なエラーが発生しました

書いた感想

setNextの書き方が上手い。こう書くことで数珠つなぎを実装している。数珠つなぎで順次チェックして実行したりしなかったりしてモードを表現している。

書いたコード

github

参考サイト

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

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