/ DESIGN-PATTERN

책임 연쇄 패턴 - Chain Of Reponsibility Pattern [디자인패턴/코틀린/kotlin]

요청을 처리를 하나이상의 체인형태로 구성된 객체에게 위임하고 요청을 처리할 수 있는 객체를 만날 때까지 다음 객체로 처리를 위임하는 패턴

책임 연쇄 패턴 - Chain Of Reponsibility Pattern

책임 연쇄 패턴이란

요청을 처리를 하나이상의 체인형태로 구성된 객체에게 위임하고 요청을 처리할 수 있는 객체를 만날 때까지 다음 객체로 처리를 위임하는 패턴

장점

  • 요청의 처리 방식을 다음 객체로 위임하면서 분기처리가 없어진다.
  • 요청의 처리를 layer 방식으로 나누어 처리하므로 객체간 결합도를 낮춘다.

단점

  • 요청을 처리하는 객체들을 어떻게 구성하느냐에 따라 요청이 처리될 수도 아닐 수도 있다.
  • 무한루프에 빠질 수 있으니 잘 고려해서 구성 해야함

클래스 다이어그램

class-diagram

예제코드

처리객체

interface Rider {
    fun delivery(foodType: String): String
}

class FullTimeRider(var next: Rider? = null) : Rider {
    override fun delivery(foodType: String) =
            if (foodType == "양식") "양식배달" else next!!.delivery(foodType)
}

class PartTimeRider(var next: Rider? = null) : Rider {
    override fun delivery(foodType: String) =
            if (foodType == "한식") "한식배달" else next!!.delivery(foodType)
}

class ConnectRider(var next: Rider? = null) : Rider {
    override fun delivery(foodType: String) =
            if (foodType == "분식") "분식배달" else next!!.delivery(foodType)
}

처리할 수 없으면 다음 객체에 처리를 넘긴다.
처리의 전체적인 구성은 인스턴스 생성시 어떻게 다음 객체들을 구성 했느냐에 따라 달라진다.

클라이언트


class RiderService(private val rider: Rider) {
    fun delivery(foodType:String): String {
        // 분기 처리가 사라진다. 
        // if (foodType == "양식")
        //     val fullTimeRider = FullTimeRider()
        //     fullTimeRider.delivery()
        // else if (oodType == "한식")
        //     val partTimeRider = PartTimeRider()
        //     partTimeRider.delivery()
        // else
        // ....    
        return rider.delivery(foodType)
    }  
}

val riderService = RiderService(FullTimeRider(PartTimeRider(ConnectRider())))

val delivery = riderService.delivery("분식")
kimchanjung

김찬정

좀 더 넓은 TEST 커버리지! 좀 더 나은 Architecture! 좀 더 나은 Code Pattern! 보다 더 간결하고 깔끔한 코드!를 항상 갈망 합니다.

Read More