[python] 책임 연쇄 디자인 패턴

책임 연쇄 디자인 패턴은 객체들 사이의 결합도를 낮추고, 요청을 처리하기 위해 다수의 객체를 체인 형태로 연결하여 처리하는 패턴입니다. 이 패턴은 객체가 직접 요청을 처리하지 않고, 다른 객체에게 책임을 위임하여 처리합니다.

패턴 구현 방법

  1. 책임 체인을 구성할 클래스들을 정의합니다. 각 클래스는 책임을 처리할 메서드를 가지고 있어야 합니다.
  2. 체인 안의 객체들은 다음 객체에게 책임을 전달할지 결정하고, 전달하지 않을 경우 현재 객체에서 처리합니다.
  3. 요청이 들어오면 첫 번째 객체에서부터 책임을 전달하며, 처리할 수 있는 객체를 찾을 때까지 체인을 따라 이동합니다.
  4. 체인 안의 객체들 중 하나가 요청을 처리하면 프로세스는 종료됩니다.

예제 코드

다음은 책임 연쇄 디자인 패턴을 사용하는 예제 코드입니다.

class Handler:
    def __init__(self, successor=None):
        self.successor = successor

    def handle_request(self, request):
        if self.successor:
            self.successor.handle_request(request)
        else:
            print("No handler found for the request")

class ConcreteHandler1(Handler):
    def handle_request(self, request):
        if request == "A":
            print("ConcreteHandler1 handles the request")
        else:
            super().handle_request(request)

class ConcreteHandler2(Handler):
    def handle_request(self, request):
        if request == "B":
            print("ConcreteHandler2 handles the request")
        else:
            super().handle_request(request)

class ConcreteHandler3(Handler):
    def handle_request(self, request):
        if request == "C":
            print("ConcreteHandler3 handles the request")
        else:
            super().handle_request(request)

# 책임 체인 구성
handler1 = ConcreteHandler1(ConcreteHandler2(ConcreteHandler3()))

# 요청 처리
handler1.handle_request("B")
handler1.handle_request("D")

위 코드에서는 Handler 클래스를 상속하여 ConcreteHandler1, ConcreteHandler2, ConcreteHandler3 클래스를 정의합니다. 각 핸들러는 요청(request)을 처리하는 handle_request 메서드를 가지고 있습니다.

실행 결과는 다음과 같습니다.

ConcreteHandler2 handles the request
No handler found for the request

결론

책임 연쇄 디자인 패턴은 객체들 사이의 결합도를 낮추고, 유연한 코드를 작성할 수 있도록 도와줍니다. 요청을 처리하는 객체가 동적으로 결정되고 변경될 수 있을 때 유용한 패턴입니다.