보뇨 다이어리

코틀린 디자인 패턴 - 구조 패턴 이해하기 (브릿지) 본문

컴퓨터 관련/Kotlin 정보

코틀린 디자인 패턴 - 구조 패턴 이해하기 (브릿지)

보뇨 2024. 12. 11. 15:49
반응형

브릿지 패턴은 이전에도 소개했었지만 간략하게 말하자면 인터페이스 구현을 통해 모든 기능을 만들게되면 

인터페이스 한개를 수정할때 구현받은 모든 클래스를 수정해야한다는 문제가 생기지만 각각 기능을 각각의 인터페이스로 쪼개서

별도의 구현 클래스로 분리하게된다면 영향도는 비교적 최소화할수있다.

 

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
typealias PointsOfDamage = Long
typealias Meters = Int // java 일경우 별도의 클래스를 만들어야했는데 별칭지정하여 간단하게 구현가능
 
class Chapter03BridgeTest {
 
    @Test
    fun bridgePatternTest() {
        // 일반적인경우 구현만 받아서 처리할수있는데 하나의 인터페이스 구현만할경우 변경요소가 N개만큼 발생하기때문에
        // 초기화하기위해 각 동작에 따른 기능을 분리하여 HasA 관계로 수정
        val stormTrooper = StormTrooper(Rifle(), RegularLegs())
        val flameTrooper = StormTrooper(FlameThrower(), RegularLegs())
        val scoutTrooper = StormTrooper(Batton(), AthleticLegs())
 
        println("이동")
        stormTrooper.move(1L,1L)
        flameTrooper.move(1L,1L)
        scoutTrooper.move(1L,1L)
 
        println("공격")
        stormTrooper.attackRebel(1L, 1L)
        flameTrooper.attackRebel(1L, 1L)
        scoutTrooper.attackRebel(1L, 1L)
    }
 
    interface Trooper {
        fun move(x: Long, y: Long)
        fun attackRebel(x: Long, y: Long)
    }
 
    interface Weapon {
        fun attack(): PointsOfDamage
    }
 
    interface Legs {
        fun move(): Meters
    }
 
    class Rifle : Weapon {
        override fun attack(): PointsOfDamage = RIFLE_DAMAGE
    }
 
    class FlameThrower : Weapon {
        override fun attack(): PointsOfDamage = RIFLE_DAMAGE * 2
    }
 
    class Batton : Weapon {
        override fun attack(): PointsOfDamage = RIFLE_DAMAGE * 3
    }
 
    class RegularLegs : Legs {
        override fun move(): Meters = REGULAR_SPEED
    }
 
    class AthleticLegs : Legs {
        override fun move(): Meters = REGULAR_SPEED * 2
    }
 
    class StormTrooper(
        private val weapon: Weapon,
        private val legs : Legs,
    ) : Trooper {
        override fun move(x: Long, y: Long) {
            println("이동 - ${legs.move()}")
        }
 
        override fun attackRebel(x: Long, y: Long) {
            println("공격 - ${weapon.attack()}")
        }
    }
 
    companion object {
        const val RIFLE_DAMAGE = 3L
        const val REGULAR_SPEED: Meters = 1
    }
}
cs
반응형