"""Chain of Responsibility Design Pattern Gist. Suppose we have content which we want to validate or pass some filters on before making the content public. It can be pretty tedious manually passing the content through different methods. This is a possible usecase for the chain of responsibility design pattern. We can design some filtration or validation methods and have a class that accepts a list of functions as arguments. The class would has a method which applies each method onto the content and then returns the content. """ def offensive_filter(content): """Replaces offensives words with "(beep)""" badWords = ['stupid', 'idiot', 'potatohead'] for badWord in badWords: content = content.replace(badWord, 'great') return content def remove_incriminating_terms(content): incriminatingPhrases = ['I am a criminal', 'I am guilty', 'I am bad'] for incriminatingPhrase in incriminatingPhrases: content = content.replace( incriminatingPhrase, incriminatingPhrase[:5] + 'not ' + incriminatingPhrase[5:] ) return content class ContentFilter: def __init__(self, filters=None): self._filters = list() if filters is not None: self._filters += filters def filter(self, content): for filter in self._filters: content = filter(content) return content content = 'I feel so stupid! I am a criminal' filter = ContentFilter([offensive_filter, remove_incriminating_terms]) filtered_content = filter.filter(content) print(content) # >> I feel so stupid! I am a criminal print(filtered_content) # >> I feel so great! I am not a criminal