프런트엔드/디자인 패턴

[1일차] 책임연쇄 | 행동 패턴 11일만에 끝내기 챌린지 - GoF 디자인 패턴

조드래곤나인 2023. 7. 16. 14:59

 

출처: 에릭 감마 , 리처드 헬름 , 랄프 존슨 , 존 블리시디스. 『Gof의 디자인 패턴』. 김정아(역). 프로텍미디어, 2015.

 

 

[1일차] 책임연쇄(Chain of responsibility)
행동 패턴 11일만에 끝내기 챌린지 - GoF 디자인 패턴

타입스크립트로 설명하는 GoF 디자인 패턴의 행동 패턴 11일만에 끝내기 챌린지

 

 

책임연쇄란?

메세지를 보내는 객체와 이를 받아 처리하는 객체들 간의
결합도를 없애기 위한 패턴입니다.
하나의 요청에 대한 처리가 반드시 한 객체에서만 되지 않고,
여러 객체에게 그 처리 기회를 주려는 것입니다.

 

 

활용성

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

2) 메시지를 받을 객체를 명시하지 않은 채

여러 객체 중 하나에게 처리를 요청하고 싶을 때

 

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

 

 

구조 및 구현

interface Handler {
    next?: Handler
    handle(request: string): void
    setNext(next: Handler): void
}

abstract class BaseHandler implements Handler {
    next?: Handler
    abstract handle(request: string): void
    handleNext(request: string) {
       if (this.next) {
            this.next.handle(request)
        } 
    }
    setNext(next: Handler) {
        this.next = next
    }
}

class ConcreteHandler1 extends BaseHandler {
    handle(request: string) {
        if (request === 'First') {
            console.log('ConcreteHandler1!')
        } else {
            this.handleNext(request)
        }
    }
}

class ConcreteHandler2 extends BaseHandler {
    handle(request: string) {
        if (request === 'Second') {
            console.log('ConcreteHandler2!')
        } else {
            this.handleNext(request)
        }
    }
}

class ConcreteHandler3 extends BaseHandler {
    handle(request: string) {
        if (request === 'Third') {
            console.log('ConcreteHandler3!')
        } else {
            this.handleNext(request)
        }
    }
}
 
class Main {
    constructor() {
        const handle1 = new ConcreteHandler1()
        const handle2 = new ConcreteHandler2()
        const handle3 = new ConcreteHandler3()

        handle1.setNext(handle2)
        handle2.setNext(handle3)

        handle1.handle('First') // ConcreteHandler1!
        handle1.handle('Second') // ConcreteHandler2!
        handle1.handle('Third') // ConcreteHandler3!
    }
}
 

사용자는 처리를 요청하고,
이 처리 요청을 실제로 그 요청을 받을 책임이 있는
ConcreteHandler객체를 만날 때까지 정의된 연결고리를 따라서 계속 전달됩니다.

 

 

결과

1) 객체 간의 행동적 결합도가 적어집니다.

2) 객체에게 책임을 할당하는 데 유연성을 높일 수 있습니다.

3) 메시지 수신이 보장되지는 않습니다.
어떤 객체가 이 처리에 대한 수신을 담당한다는 것을
명시하지 않으므로 요청이 처리된다는 보장이 없습니다.

 


 

728x90