[디자인패턴] 브릿지 패턴

Benji Android·2023년 4월 30일
0
post-thumbnail

정의

추상적인 것과 구체적인 것을 분리하여 연결하는 패턴.


구현할 클래스 목록

  • Abstraction : 기능 계층의 최상위 클래스, 추상 인터페이스
  • Refind Abstraction : 기능 계층에서 새로운 부분을 확장한 클래스
  • Implementation : Abstraction의 기능을 구현하기 위한 인터페이스
  • Concreate Implementation : 실제 기능을 구현한 클래스

Implementation & Concreate Implementation

TV Interface 구현

interface TV {
    fun on()
    fun off()
    fun tuneChannel(channel: Int)
    fun getChannel(): Int
}

TV를 동작시키기 위해 필요한 공통 기능을 TV interface 에 함수로 정의 하고 Concreate Implementation 에 구현하도록 정의 합니다.

추상화(RemoteControl)는 TV interface 에 선언된 메서드를 통해서만 구현 객체와 소통할 수 있습니다.

Concreate Implementation 구현

/**
	공통으로 사용하는 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의 맞춤 코드를 작성하여 동작하도록 합니다.


Abasraction & Refind Abstraction

RemoteControl 구현

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)에 의존해 하위 수준의 작업을 진행한다.

GenericRemote 구현

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()

    }
}


마무리

브릿지 패턴은 추상적인 것과 구체적인 것을 분리하고 브릿지(다리)를 통해 서로 이어주는 패턴 입니다.

개발자는 해당 패턴을 사용하기 전에 미리 추상적인 것과 구체적인 것을 분리하는 과정이 필요합니다.

장점

  • 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다. (OCP)
  • 추상적인 코드와 구체적인 코드를 분리할 수 있다.

단점

  • 계층 구조가 늘어나 복잡도가 증가할 수 있다.

참고

profile
Android 주니어 개발자

0개의 댓글