1. Definition
The Chain of Responsibility Design Pattern decouples the sender from the receiver of a request by allowing more than one object to handle the request. The request is passed along a chain of potential handlers until one is found that can process the request or until the end of the chain is reached.
2. Problem Statement
Suppose you have various levels of logging (e.g., INFO, DEBUG, ERROR). Instead of implementing a monolithic piece of code to handle all these log levels, you'd like a system where each level is handled independently. Additionally, if a level can't handle a request, it should be able to delegate that request to the next level in the chain.
3. Solution
Implement a chain of objects where each object in the chain either handles the request or forwards it to the next object in the chain. Each handler decides whether to process the request or pass it along.
4. Real-World Use Cases
1. Event propagation in GUI libraries.
2. Middleware in web frameworks, where each middleware can decide to process the request or pass it along.
3. Workflow systems where a task moves from one stage to another.
5. Implementation Steps
1. Define a handler interface with a method to set the next handler and a method to handle the request.
2. Implement concrete handlers that decide whether to process the request or pass it to the next handler.
3. Chain the handlers in a specific order.
6. Implementation in Python
# Step 1: Define the handler interface class Handler: def __init__(self): self.next_handler = None def set_next(self, handler): self.next_handler = handler def handle_request(self, request_type): pass # Step 2: Implement concrete handlers class InfoLogger(Handler): def handle_request(self, request_type): if request_type == "INFO": print("Logging INFO level message.") elif self.next_handler: self.next_handler.handle_request(request_type) class DebugLogger(Handler): def handle_request(self, request_type): if request_type == "DEBUG": print("Logging DEBUG level message.") elif self.next_handler: self.next_handler.handle_request(request_type) class ErrorLogger(Handler): def handle_request(self, request_type): if request_type == "ERROR": print("Logging ERROR level message.") elif self.next_handler: self.next_handler.handle_request(request_type) # Step 3: Chain the handlers info_logger = InfoLogger() debug_logger = DebugLogger() error_logger = ErrorLogger() info_logger.set_next(debug_logger) debug_logger.set_next(error_logger) info_logger.handle_request("DEBUG")
Output:
"Logging DEBUG level message."
Explanation:
1. We define an abstract Handler with methods to set the next handler and handle a request.
2. Concrete implementations (like InfoLogger, DebugLogger, ErrorLogger) decide how to process the request.
3. In our example, when we send a "DEBUG" message, it first hits the InfoLogger. Since InfoLogger can't handle it, the message is passed to DebugLogger, which logs the message.
4. The pattern promotes loose coupling as the sender only communicates with the head of the chain, and handlers don't need to know about the inner workings of their successors.
7. When to use?
The Chain of Responsibility Pattern is beneficial when:
1. There are multiple ways to handle a request, but clear criteria exist on which handler is appropriate.
2. The set of handlers can dynamically change, or their sequence needs flexibility.
3. Decoupling of sender and receiver objects is required.
Design Pattern Related Python Source Code Examples:
Python string literals Python string length example Python String join() method example Python string split() method example Python String index() method example Python string find() method example Python string startswith() method example Python string endswith() method example Python String lower() method example Python String upper() method example Python string title() method example Python string capitalize() method example Python string islower() method example Python string istitle() method example Python string isupper() method example Python string swapcase() method example Python string strip() method example Python string replace() method example Python string isdigit() method example Python string isdecimal() method example Python string isnumeric() method example Python string isalpha() method example Python string isalnum() method example Write a python program to concatenate strings in different ways Python program to create a new string by appending s2 in the middle of s1 Split a given string on asterisk into several substrings and display each substring in Python Write a Python program to count all lower case, upper case, digits, and special symbols from a given string Write a python program to return a string such that the string is arranged from lowercase letters and then uppercase letters Write a Python Class to Reverse a String Word by Word Write a python class to implement pow(x, n) Write a python class to convert an integer to a Roman numeral Write a python program to find the factorial of a number using recursion Write a Python program to convert temperature in Celsius to Fahrenheit Write a Python program to find the largest number among the three input numbers Write a Python program to print only even numbers using the function Write a python program to filter integer, float, string from a list Write a python program to check whether the given number is greater than 50 and also divisible by 2 using nested if else Write a python program to demonstrate a simple class creation Write a python program to demonstrate the object as an argument Write a python program to demonstrate an object as an argument with default values Write a python program to demonstrate method overriding Write a Python program for Linear Search and Binary Search Python list - insert, remove, append, len, pop and clear example Write a python program to add two numbers Write a python program to get the python version Write a python program to check whether the first and last letters of the given word is vowel or not ? Write a python program to count the number of digits Write a python program to filter integer, float, string from a list Write a python program to find the average of 10 numbers Write a python program to traverse a list and print the values in it Write a python program to print first 20 natural numbers using while loop Write a python program to print the square of all numbers from 1 to 10 Write a python program to get the sum of digits Write a python program to print right angle triangle pattern using * Write a python program to remove vowels in a word Write a python program to find absolute value using function Wrtie a python program to demonstrate the use of variable length arguments Write a python program to demonstrate the use of default arguments Write a python program to demonstrate the use of keyword arguments Write a python program to print a simple list using functions Write a python program to find the max values in a list using function Given a string of odd length greater 7, return a string made of the middle three chars of a given String Arrange string characters such that lowercase letters should come first Write a Python program to Count all lower case, upper case, digits, and special symbols from a given string Write a Python program to Find all occurrences in a given string ignoring the case Given an input string, count occurrences of all characters within a string and return the details as dictionary Write a Python program to Split a given string on asterisk into several substrings and display each substring Write a Python program to Check whether the given string startswith 'h' Write a python program to concatenate strings in different ways Write a python program to return a string such that the string is arranged from lowercase letters and then uppercase letters Write a python program to repeat a givent string multiple times Write a python program to create a simple list and nested list with different datatypes Write a python program to add elements to an existing list from user input Write a python program to reverse a given list Write a python program to convert a list to tuple using tuple function Write a python program to check whether the user given input is equal to the current working directory or not Write a Python program for Linear Search and Binary Search Selection Sort Algorithm in Python Bubble Sort Algorithm in Python Bogo Sort Algorithm in Python Bucket Sort Algorithm in Python Comb Sort Algorithm in Python Counting Sort Algorithm in Python Heap Sort Algorithm in Python Insertion Sort Algorithm in Python Merge Sort Algorithm in Python Quick Sort Algorithm in Python Shell Sort Algorithm in Python Interpolation Search Algorithm in Python Stack Implementation in Python Queue Implementation in Python Deque Implementation in Python Singly Linked List Implementation in Python Doubly Linked List Implementation in Python Circular Linked List Implementation in Python PriorityQueue Implementation in Python Circular Queue Implementation in Python Binary Search Tree Implementation in Python Stack Implementation Using Linked List in Python Stack Implementation Using Doubly Linked List in Python Python - Convert Binary to Decimal Example Python - Convert Binary to Hexadecimal Example Python - Convert Binary to Octal Example Python - Convert Decimal to Binary Example Python - Convert Decimal to Octal Example Python Convert String to Int Python Convert String to DateTime Python Convert String to Date Python Convert String to JSON Python Convert String to Number Python Convert String to List Python Convert String to Float Python Convert String to Bytes Python Convert List to String Python Convert List to Set Python Convert List to Dictionary Python Convert List to Tuple Python Convert List to JSON Python Convert List to Array Python Convert List to String With Commas Python Convert List to Dataframe Python Convert Set to List Python Convert Set to String Python Convert Set to Tuple Python Convert Set to Dictionary Python Convert Set to JSON Python Convert Set to Comma Separated String Python Convert Dictionary to JSON Python Convert Dictionary to Dataframe Python Convert Dictionary to String Python Convert Dictionary to List Python Convert Dictionary Keys to List Python Convert Dictionary Values to List Python Convert Dictionary to Tuple Python Convert Array to String Python Convert Array to String With Commas Python Convert Array to List Python Convert Array to Set Python Convert Array to JSON Python Convert Array to Dictionary Python Convert Array to Tuple Python Convert Int to String Python Convert Int to Binary Python Convert Int to Float Python Convert Date to String Python Convert Date to Epoch Python Convert Date to Unix Timestamp Python Convert Date to DateTime Python Convert Date to DateTime Python Convert Date to Timestamp Python Convert Date String to DateTime Python Convert Date String to Epoch Python Convert Tuple to String Python Convert Tuple to List Python Convert Tuple to Dictionary Python Convert Tuple to Comma Separated String Python Convert Tuple to Array Python Convert Tuple to JSON Python Convert JSON to String Python Convert JSON to Dictionary Python Convert JSON to Array Python Convert JSON to XML Python Convert JSON to List Python Python Design Patterns
Comments
Post a Comment