feat : Design Pattern - 데코레이터(Decorator) 패턴 구현

This commit is contained in:
banjjoknim
2022-11-16 01:35:13 +09:00
parent beab021cfb
commit a279d6b481
11 changed files with 133 additions and 4 deletions

View File

@@ -93,6 +93,13 @@
### 데코레이터(Decorator) 패턴
#### 구현 요구사항
- 용사는 검을 가진다.
- 용사는 검을 바꿀 수 있다.
- 검에는 속성이 부여될 수 있으며, 속성에 따라 공격이 변한다.
- 용사가 공격하면 소지한 무기의 공격이 발동된다.
### 프록시(Proxy) 패턴
#### 구현 요구사항
@@ -118,8 +125,8 @@
#### 구현 요구사항
- 주문의 상태가 변경되면 배송팀과 운영팀에 알리고, 각각의 팀은 그에 따른 조치를 취한다.
- 배송팀은 배송을 시작한다.
- 운영팀은 고객에게 메시지를 전송한다.
- 배송팀은 배송을 시작한다.
- 운영팀은 고객에게 메시지를 전송한다.
- 배송팀과 운영팀 외에 다른 팀에도 필요하다면 또 다른 팀에 메시지를 전송해야 할 수도 있다.
### 미디에이터(Mediator) 패턴
@@ -136,8 +143,8 @@
- 회원의 모든 정보를 조회한다.
- 회원의 모든 정보에는 회원의 기본 정보와 친구들에 대한 정보가 있다.
- 회원의 기본 정보에는 이름, 나이가 있다.
- 회원의 친구 정보에는 친구의 이름, 나이가 있다.
- 회원의 기본 정보에는 이름, 나이가 있다.
- 회원의 친구 정보에는 친구의 이름, 나이가 있다.
### 추상 팩토리(Abstract Factory) 패턴

View File

@@ -0,0 +1,9 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.after
import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword
class Fire(private val sword: Sword) : SwordDecorator() {
override fun skill(): String {
return "불꽃 ${sword.skill()}"
}
}

View File

@@ -0,0 +1,23 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.after
import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Hero
import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword
class HeroApplication
fun main() {
val hero = Hero()
hero.attack()
val fireSword = Fire(Sword.DEFAULT)
hero.changeSword(fireSword)
hero.attack()
val iceSword = Ice(Sword.DEFAULT)
hero.changeSword(iceSword)
hero.attack()
val fireIceSword = Fire(Ice(Sword.DEFAULT))
hero.changeSword(fireIceSword)
hero.attack()
}

View File

@@ -0,0 +1,9 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.after
import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword
class Ice(private val sword: Sword) : SwordDecorator() {
override fun skill(): String {
return "얼음 ${sword.skill()}"
}
}

View File

@@ -0,0 +1,5 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.after
import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword
abstract class SwordDecorator : Sword()

View File

@@ -0,0 +1,9 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.before
import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword
class FireIceSword : Sword() {
override fun skill(): String {
return "화염 얼음 ${DEFAULT.skill()}"
}
}

View File

@@ -0,0 +1,9 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.before
import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword
class FireSword : Sword() {
override fun skill(): String {
return "화염 ${DEFAULT.skill()}"
}
}

View File

@@ -0,0 +1,22 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.before
import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Hero
class HeroApplication
fun main() {
val hero = Hero()
hero.attack()
val fireSword = FireSword()
hero.changeSword(fireSword)
hero.attack()
val iceSword = IceSword()
hero.changeSword(iceSword)
hero.attack()
val fireIceSword = FireIceSword()
hero.changeSword(fireIceSword)
hero.attack()
}

View File

@@ -0,0 +1,9 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.before
import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword
class IceSword : Sword() {
override fun skill(): String {
return "얼음 ${DEFAULT.skill()}"
}
}

View File

@@ -0,0 +1,14 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common
class Hero(
private var sword: Sword = Sword.DEFAULT
) {
fun changeSword(sword: Sword) {
this.sword = sword
}
fun attack() {
val swordSkill = sword.skill()
println("용사가 [$swordSkill]을 발동합니다.")
}
}

View File

@@ -0,0 +1,13 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common
abstract class Sword {
abstract fun skill(): String
companion object {
val DEFAULT = object : Sword() {
override fun skill(): String {
return "참격"
}
}
}
}