🦓
【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の書き方が上手い。こう書くことで数珠つなぎを実装している。数珠つなぎで順次チェックして実行したりしなかったりしてモードを表現している。
書いたコード
参考サイト
フリーランスでpythonエンジニアとして働きたく勉強中。
前職は運用SEとセキュリティエンジニア。
開発は学校で学んだ経験と趣味でやっていた程度。一応前職でも業務の自動化のためにExcel VBAやセキュリティテスト用のWebサイトの開発やセキュリティテストツールの改良などで開発はやっていた。