추상적인 것과 구체적인 것을 분리하여 연결하는 패턴.
interface TV {
fun on()
fun off()
fun tuneChannel(channel: Int)
fun getChannel(): Int
}
TV를 동작시키기 위해 필요한 공통 기능을 TV interface
에 함수로 정의 하고 Concreate Implementation
에 구현하도록 정의 합니다.
추상화(RemoteControl)는 TV interface 에 선언된 메서드를 통해서만 구현 객체와 소통할 수 있습니다.
/**
공통으로 사용하는 on, off 함수를 구현하고 TV의 타입을 받아 구별한다.
*/
abstract class DefaultTV(
val type: String
) : TV {
override fun on() {
println("Turning on the $type TV.")
}
override fun off() {
println("Turning off the $type TV.")
}
/**
LG 브랜드의 TV를 정의하고
각 TV에 저장된 `channel` 변수를 사용하여 채널을 조작한다.
*/
class LG : DefaultTV("LG") {
private var channel: Int = 1
override fun tuneChannel(channel: Int) {
this.channel = channel
println("Set the $type TV Channel to ${this.channel}")
}
override fun getChannel(): Int {
return this.channel
}
}
각 브랜드 별 TV의 맞춤 코드를 작성하여 동작하도록 합니다.
abstract class RemoteControl(private val tvFactory: TVFactory) {
private lateinit var tv: TV
fun on() {
this.tv.on()
}
fun off() {
this.tv.off()
}
fun setChannel(channel: Int) {
tv.tuneChannel(channel)
}
fun getChannel(): Int {
return this.tv.getChannel()
}
fun setTV(type: String) {
try {
tv = tvFactory.getTV(type)
} catch (e: Exception) {
println(e)
}
}
}
TV Factory
에서 TV의 종류를 가져와 리모컨의 역할을 수행할 수 있도록 구현된 구현체이다.
구현 객체(TV interface)에 의존해 하위 수준의 작업을 진행한다.
class GenericRemote(tvFactory: TVFactory) : RemoteControl(tvFactory) {
fun nextChannel() {
val channel = this.getChannel()
this.setChannel(channel + 1)
}
fun prevChannel() {
val channel = this.getChannel()
this.setChannel(channel - 1)
}
}
RemoteControl 의 변형된 코드를 제공합니다. 부모처럼 구현 객체를 가져와 새로운 또는 복잡한 동작을 정의합니다.
class BridgeClient {
init {
val tvFactory = TVFactory()
val remoteSony = SpecialRemote(tvFactory)
println()
println("Connect your remote to the TV.")
remoteSony.setTV("Sony")
remoteSony.on()
remoteSony.up()
remoteSony.up()
remoteSony.down()
remoteSony.off()
println("==============================\n")
val remoteLG = GenericRemote(tvFactory)
println("Connect your remote to the TV.")
remoteLG.setTV("LG")
remoteLG.on()
remoteLG.setChannel(30)
remoteLG.nextChannel()
remoteLG.prevChannel()
remoteLG.prevChannel()
remoteLG.off()
println("==============================\n")
val remoteSamsung = GenericRemote(tvFactory)
println("Connect your remote to the TV.")
remoteSamsung.setTV("Samsung")
remoteSamsung.setChannel(99)
remoteSamsung.nextChannel()
remoteSamsung.nextChannel()
remoteSamsung.nextChannel()
remoteSamsung.off()
}
}
브릿지 패턴은 추상적인 것과 구체적인 것을 분리하고 브릿지(다리)를 통해 서로 이어주는 패턴 입니다.
개발자는 해당 패턴을 사용하기 전에 미리 추상적인 것과 구체적인 것을 분리하는 과정이 필요합니다.