[kotlin] 체인 오브 리스폰시빌리티 디자인 패턴과 코틀린

코틀린은 람다 표현식과 고차 함수를 지원하여 함수형 프로그래밍을 효과적으로 지원합니다. 체인 오브 리스폰시빌리티(Chain of Responsibility)는 객체 간의 연결된 책임을 분산시키는 디자인 패턴으로서, 이와 관련된 예시를 통해 코틀린에서 이를 어떻게 구현하는지 살펴보겠습니다.

체인 오브 리스폰시빌리티란?

체인 오브 리스폰시빌리티는 요청을 처리할 수 있는 객체를 연결하여 요청을 보내고 그 요청을 처리하는 객체를 자동으로 결정하는 디자인 패턴입니다. 이를 통해 요청의 보낸자, 수신자, 정의된 요청 사항 및 그에 대한 응답에 대한 모듈성을 나눌 수 있습니다.

코틀린에서의 구현

코틀린에서 체인 오브 리스폰시빌리티를 구현하려면 객체 지향과 함수형 프로그래밍의 접합을 고려해야 합니다. 아래는 요청을 처리할 수 있는 기본 클래스를 정의하는 코틀린 예시 코드입니다.

abstract class Handler(var successor: Handler?) {
    open fun handleRequest(request: Int) {
        successor?.handleRequest(request)
    }
}

위 예시에서 Handler 클래스는 요청을 처리하기 위한 메서드를 정의하고, successor 속성은 체인 안에서 다음으로 요청을 처리할 객체를 나타냅니다.

다음은 Handler 클래스를 상속받아 실제 요청을 처리하는 구체적인 핸들러 클래스를 정의하는 예시입니다.

class ConcreteHandler1(successor: Handler?) : Handler(successor) {
    override fun handleRequest(request: Int) {
        if (request <= 10) {
            println("Request $request handled by ConcreteHandler1")
        } else {
            successor?.handleRequest(request)
        }
    }
}

class ConcreteHandler2(successor: Handler?) : Handler(successor) {
    override fun handleRequest(request: Int) {
        if (request > 10 && request <= 20) {
            println("Request $request handled by ConcreteHandler2")
        } else {
            successor?.handleRequest(request)
        }
    }
}

위 코드에서 ConcreteHandler1ConcreteHandler2는 각각 10 이하와 20 초과 10 이하의 요청에 대해 처리하는 방식을 정의하고 있습니다.

결론

코틀린은 객체 지향과 함수형 프로그래밍을 함께 활용하여 디자인 패턴을 구현하는 데 유용하며, 체인 오브 리스폰시빌리티 패턴을 적용하는 것 또한 쉽게 이루어질 수 있습니다. 이를 통해 코드 유연성과 모듈성을 향상시킬 수 있습니다.

참고 자료