diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md index 8eb2da2..00d7130 100644 --- a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md @@ -93,6 +93,13 @@ ### 데코레이터(Decorator) 패턴 +#### 구현 요구사항 + +- 용사는 검을 가진다. +- 용사는 검을 바꿀 수 있다. +- 검에는 속성이 부여될 수 있으며, 속성에 따라 공격이 변한다. +- 용사가 공격하면 소지한 무기의 공격이 발동된다. + ### 프록시(Proxy) 패턴 #### 구현 요구사항 @@ -118,8 +125,8 @@ #### 구현 요구사항 - 주문의 상태가 변경되면 배송팀과 운영팀에 알리고, 각각의 팀은 그에 따른 조치를 취한다. - - 배송팀은 배송을 시작한다. - - 운영팀은 고객에게 메시지를 전송한다. + - 배송팀은 배송을 시작한다. + - 운영팀은 고객에게 메시지를 전송한다. - 배송팀과 운영팀 외에 다른 팀에도 필요하다면 또 다른 팀에 메시지를 전송해야 할 수도 있다. ### 미디에이터(Mediator) 패턴 @@ -136,8 +143,8 @@ - 회원의 모든 정보를 조회한다. - 회원의 모든 정보에는 회원의 기본 정보와 친구들에 대한 정보가 있다. - - 회원의 기본 정보에는 이름, 나이가 있다. - - 회원의 친구 정보에는 친구의 이름, 나이가 있다. + - 회원의 기본 정보에는 이름, 나이가 있다. + - 회원의 친구 정보에는 친구의 이름, 나이가 있다. ### 추상 팩토리(Abstract Factory) 패턴 diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Fire.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Fire.kt new file mode 100644 index 0000000..73dc3f2 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Fire.kt @@ -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()}" + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/HeroApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/HeroApplication.kt new file mode 100644 index 0000000..d7b635a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/HeroApplication.kt @@ -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() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Ice.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Ice.kt new file mode 100644 index 0000000..726c1a7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Ice.kt @@ -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()}" + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/SwordDecorator.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/SwordDecorator.kt new file mode 100644 index 0000000..e1ced59 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/SwordDecorator.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword + +abstract class SwordDecorator : Sword() diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireIceSword.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireIceSword.kt new file mode 100644 index 0000000..6e9b463 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireIceSword.kt @@ -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()}" + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireSword.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireSword.kt new file mode 100644 index 0000000..f6c3306 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireSword.kt @@ -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()}" + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/HeroApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/HeroApplication.kt new file mode 100644 index 0000000..5223d16 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/HeroApplication.kt @@ -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() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/IceSword.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/IceSword.kt new file mode 100644 index 0000000..1ebe6f7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/IceSword.kt @@ -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()}" + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Hero.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Hero.kt new file mode 100644 index 0000000..ff38811 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Hero.kt @@ -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]을 발동합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Sword.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Sword.kt new file mode 100644 index 0000000..5d622f6 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Sword.kt @@ -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 "참격" + } + } + } +}