포스트

Adapter Pattern (디자인 패턴 8장)

Adapter Pattern (디자인 패턴 8장)

Adapter Pattern (디자인 패턴 8장)

어댑터 패턴 정의

한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다.
어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다.

어댑터 패턴 언제 사용할까!?

예를 들어 기존 NormalPager 를 사용하고 있는데 LibPager 를 같이 사용해야 하는 상황이 생겼다고 가정 함.
근데 LibPageListener 는 PageListener 와 다르게 같은 기능인데 다른 메소드명을 가지고 있다.
그리고 LibPageListener 에는 없는 기능(onDoubleNextPage,onDoublePreviousPage)이 PageListener에는 존재 한다.
LibPagerAdapter 를 통해서 해결해보자!!

아래의 코드를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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 없지만 같은 기능을 하게 만들어 주었다.

아래의 결과를 보면 동일하다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.