Delegate Pattern

2023. 5. 3. 16:48개발/최적화

Delegate Pattern

  • 어떤 객체가 기능을 수행할 때, 해당 기능을 다른 객체에게 위임하는 패턴

 

 

상속과의 차이

  • 객체 안에 새로운 기능 / 객체를 구성하는 composition을 사용

 

프로세스

1과 2는 dependency 관계 , 2와 3은 implement관계.

2에는 1이 필요한 부분을 정의함. 3은 2를 구현함

kotlin에서 by를 사용하면 쉽게 가능

// 부동산과 관련된 권한들
interface Authority {
    fun stampSeal() // 도장 찍기
    ... // 기타 등등
}

// 부동산에 대해서 내가 행사할 수 있는 권리가 있어!
class Customer(private val name: String) : Authority {
    // Authority 인터페이스 구현
    override fun stampSeal() {
        println("${name} 도장 쾅")
    }
}

// 저는 중개인 입니다. 제가 대신 손님의 집을 알아봐드릴게요
class Broker(private val customer: Authority) : Authority by customer {
	// by 키워드를 통해 customer 파라미터에게 권한을 위임
}

fun main() {
    //개발자K씨
    val developerK = Customer("개발자K씨")
    //부동산중개인G씨
    val brokerG = Broker(developerK)

    bokerG.stampSeal() // 개발자K씨에게 권한을 위임받아서 도장찍겠습니다 ㅎㅎ
}

 

getValue를 오버로딩하면 변수 선언 단계에서 by 키워드를 사용할 수 있음

interface Authority {
	fun stampSeal()
}

class Customer(private val name: String) : Authority {
	// Authority 인터페이스 구현
    override fun stampSeal() {
        println("${name} 도장 쾅")
    }
    
    // getValue() 연산자 오버로딩
    operator fun getValue(nothing: Nothing?, property: KProperty<*>): Broker {
        return Broker(this)
    }
}

class Broker(private val customer: Authority) : Authority by customer {}

fun main() {
    // 개발자K씨의 권한을 위임받은 중개인G씨
    val brokerG: Broker by Customer("K")

    bokerG.stampSeal() // 개발자K씨에게 권한을 위임받아서 도장찍겠습니다 ㅎㅎ
}