정상에서 IT를 외치다

[디자인패턴] 어댑터패턴과 퍼사드패턴 본문

디자인패턴

[디자인패턴] 어댑터패턴과 퍼사드패턴

Black-Jin 2019. 5. 19. 00:51
반응형

안녕하세요. 불랙진입니다.

책 HeadFirstDesignPattern 을 보며 코드를 Kotlin 으로 바꿔가며 공부한 내용입니다.


어댑터 패턴과 퍼사드 패턴


데코레이터 패턴을 기억하시나요? 객체를 래퍼로 감싸서 새로운 역활을 부여했습니다. 이번에는 다른 목적으로 객체를 감쌀 것입니다. 실재와 다른 인터페이스를 가진 것처럼 보이도록 하는 방법입니다.




어댑터


어떤 인터페이스를 클라이언트에서 요구하는 형태의 인터페이스에 적응시켜주는 역활


오리처럼 걷고 꽥꽥거린다면 반드시 오리라고 할 수 없습니다.

오리 어댑터로 감싼 칠면조일 수도 있습니다.

interface Duck {
fun quack()
fun fly()
}

class MallardDuck: Duck {
override fun quack() {
println("Quack")
}

override fun fly() {
println("I'm flying")
}
}

Duck 을 구현하는 MallarDuck 클래스 입니다.


//칠면조를 만나 볼까요?
interface Turkey {
fun gobble() //칠면조는 골골거리는 소리를 냅니다.
fun fly() //칠면조는 날 수 있긴 합니다.
}

class WildTurky: Turkey {
override fun gobble() {
println("Gobble gobble")
}

override fun fly() {
println("I'm flying a short distance")
}
}

칠면조를 구현하는 인터페이스와 WildTurk 클래스입니다.


오리가 부족하여 칠면조를 대신 사용해야 되는 상황입니다. 물론 인터페이스가 다르기 때문에 칠면조 객체를 바로 사용할 수는 없습니다.

//칠면조를 오리로 만들어 주는 어댑터
class TurkeyAdapter(val turkey: Turkey): Duck {
override fun quack() {
turkey.gobble()
}

override fun fly() {
for(i in 0..5) {
turkey.fly()
}
}
}

칠면조를 오리로 만들어 주는 어댑터를 만들어줍니다.



val duck = MallardDuck()

val turkey = WildTurkey()
val turkeyAdapter = TurkeyAdapter(turkey)

println("--- turkey says")
turkey.gobble()
turkey.fly()

println("--- duck says")
duck.quack()

println("--- turkeyAdapter says")
turkeyAdapter.quack()
turkeyAdapter.fly()

우리는 어댑터를 사용해 칠면조를 오리로 사용할 수 있게 구현해 주었습니다.




어댑터 패턴


한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다. 어댑터에는 두 종류가 있습니다. 하나는 객체 어댑터, 다른 하나는 클래스 어댑터입니다. 여기서 클래스 어댑터에는 다중 상속을 이용하기 때문에 자바에서는 쓸 수 없습니다.


어댑터 패턴은 한 인터페이스를 다른 인터페이스로 변환하기 위한 용도로 사용됩니다.





퍼사드 패턴


어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공합니다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있습니다.




누가 무엇을 할까요?


데코레이터 : 한 인터페이스를 다른 인터페이스로 변환 -> 객체를 감싸서 새로운 행동을 추가하기 위한 용도

어댑터 : 인터페이스는 바꾸지 않고 책임만 추가 -> 객체를 감싸서 인터페이스를 바꾸이 위한 용도

퍼사드 : 인터페이스를 간단하게 바꿈 -> 일련의 객체들을 감싸서 단순화시키기 위한 용도



디자인 원칙


최소 지식 원칙 - 정말 친한 친구하고만 얘기하라

반응형
Comments