작심삼일

8주차-1. Chain of responsibility 본문

스터디/디자인 패턴

8주차-1. Chain of responsibility

yun_s 2021. 7. 8. 21:39
728x90
반응형

디자인 패턴을 모르는 사람이 스터디를 하며 적은 것이라 틀린 부분이 있을 수 있습니다.

틀린 부분은 알려주시면 감사하겠습니다.

어떤 패턴인가

메시지를 보내는 객체와 이를 받아 처리하는 객체들 간의 결합도를 없애기 위한 패턴입니다.

하나의 요청에 대한 처리가 반드시 한 객체에서만 되지 않고, 여러 객체에게 그 처리 기회를 주려는 것입니다.

 

그렇기 때문에 클라이언트에서 내부 구조를 알 필요가 없습니다.

하지만 구현해야 하는 클래스가 많아지기 때문에 디버깅이 어려워질 수 있습니다.


어떻게 쓰는가

class Handler:
    def __init__(self):
        self.nextHandler = None
    
    def handle(self):
        pass

class Handler4number(self):
    def __init__(self, cur):
        self.cur = cur
    
    def handle(self):
        if isdigit(self.cur):
            print('number')
        else:
            self.nextHandler(self.cur)
            
class Handler4str(self):
    def __init__(self, cur):
        self.cur = cur
    
    def handle(self):
        if not isdigit(self.cur):
            print('str')
        else:
            self.nextHandler(self.cur)

--------------------------------
h4num = Handler4number()
h4str = Handler4str()

h4num.nextHandler = h4str
h4str.nextHandler = h4num

어디서 활용되는가

이는 책의 내용 (p. 301)을 그대로 가져왔다.

1. 하나 이상의 객체가 요청을 처리해야 하고, 그 요청 처리자 중 어떤 것이 선행자(priori)인지 모를 때, 처리자가 자동으로 확정되어야 합니다.

2. 메시지를 받을 객체를 명시하지 않은 채 여러 객체 중 하나에게 처리를 요청하고 싶을 때

3. 요청을 처리할 수 있는 객체 집합이 동적으로 정의되어야 할 때


My Opinion

한 객체가 한가지 일만 하도록 할 때, 어떤 일이 연속적으로 이루어져야 할 때 사용한다.

next를 이용해 다음에 행해질 행동이나 함수를 지정해서 chain을 만들어준다.

python의 try/except도 이 패턴을 사용한 것이라 한다.

개인적으로는 내가 코딩할 때 이렇게 각 역할마다 객체를 만들지 의문이다. (귀찮아서 잘 안 할 듯 ㅜ)

728x90
반응형

'스터디 > 디자인 패턴' 카테고리의 다른 글

9주차-1. Composite  (0) 2021.07.21
8주차-2. Iterator  (0) 2021.07.08
7주차-2. Visitor  (0) 2021.06.23
7주차-1. Flyweight  (0) 2021.06.23
6주차-2. Strategy  (0) 2021.06.09
Comments