Adapter Pattern (디자인 패턴 8장)
어댑터 패턴 정의
한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다.
어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다.
어댑터 패턴 언제 사용할까!?
예를 들어 기존 NormalPager 를 사용하고 있는데 LibPager 를 같이 사용해야 하는 상황이 생겼다고 가정 함.
근데 LibPageListener 는 PageListener 와 다르게 같은 기능인데 다른 메소드명을 가지고 있다.
그리고 LibPageListener 에는 없는 기능(onDoubleNextPage,onDoublePreviousPage)이 PageListener에는 존재 한다.
LibPagerAdapter 를 통해서 해결해보자!!
아래의 코드를 보자.
class AdapterPattern {
interface PageListener {
fun onPreviousPage()
fun onDoublePreviousPage()
fun onNextPage()
fun onDoubleNextPage()
}
class NormalPager : PageListener {
override fun onPreviousPage() {
println("NormalPager onPreviousPage")
}
override fun onDoublePreviousPage() {
println("NormalPager onPreviousPage")
println("NormalPager onPreviousPage")
}
override fun onNextPage() {
println("NormalPager onNextPage")
}
override fun onDoubleNextPage() {
println("NormalPager onNextPage")
println("NormalPager onNextPage")
}
}
class LibPager : LibPageListener {
override fun onPrevious() {
println("LibPager onPrevious")
}
override fun onNext() {
println("LibPager onNext")
}
}
interface LibPageListener {
fun onPrevious()
fun onNext()
}
class LibPagerAdapter(private val libPageListener: LibPageListener) : PageListener {
override fun onPreviousPage() {
libPageListener.onPrevious()
}
override fun onDoublePreviousPage() {
libPageListener.onPrevious()
libPageListener.onPrevious()
}
override fun onNextPage() {
libPageListener.onNext()
}
override fun onDoubleNextPage() {
libPageListener.onNext()
libPageListener.onNext()
}
}
@Test
fun test() {
val normalPager = NormalPager()
normalPager.onNextPage()
normalPager.onPreviousPage()
normalPager.onDoubleNextPage()
normalPager.onDoublePreviousPage()
val libPager = LibPager()
val libPagerAdapter = LibPagerAdapter(libPager)
libPagerAdapter.onNextPage()
libPagerAdapter.onPreviousPage()
libPagerAdapter.onDoubleNextPage()
libPagerAdapter.onDoublePreviousPage()
}
}
위의 코드를 보면 onDoublePreviousPage,onDoubleNextPage 는 LibPageListener 없지만 같은 기능을 하게 만들어 주었다.
아래의 결과를 보면 동일하다.