diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md index 8169a48..c5635fd 100644 --- a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md @@ -82,6 +82,15 @@ ### 상태(State) 패턴 +#### 구현 요구사항 + +- 상태별로 다르게 움직이는 게임 캐릭터를 구현한다. + - 기본적으로 게임 캐릭터는 정지상태이다. + - 정지 상태에서 버튼을 누르면 이동한다. + - 이동하는 상태에서 버튼을 누르면 점프한다. + - 점프하는 상태에서 버튼을 누르면 착지한 뒤 정지한다. + - 게임 캐릭터는 버튼을 누르면 동작하는 상태로 스스로의 상태를 변경한다. + ### 데코레이터(Decorator) 패턴 ### 프록시(Proxy) 패턴 diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacter.kt new file mode 100644 index 0000000..e76424f --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacter.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.after + +class GameCharacter( + private var state: State = StoppingState() +) { + fun move() { + state.move(this) + } + + fun changeState(newState: State) { + this.state = newState + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacterApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacterApplication.kt new file mode 100644 index 0000000..a117167 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacterApplication.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.after + +class GameCharacterApplicationAfter + +fun main() { + val gameCharacter = GameCharacter() + gameCharacter.move() + gameCharacter.move() + gameCharacter.move() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/State.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/State.kt new file mode 100644 index 0000000..161b57f --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/State.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.after + +interface State { + fun move(gameCharacter: GameCharacter) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/States.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/States.kt new file mode 100644 index 0000000..1108b77 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/States.kt @@ -0,0 +1,22 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.after + +class StoppingState : State { + override fun move(gameCharacter: GameCharacter) { + println("캐릭터가 이동한다.") + gameCharacter.changeState(MovingState()) + } +} + +class MovingState : State { + override fun move(gameCharacter: GameCharacter) { + println("캐릭터가 점프한다.") + gameCharacter.changeState(JumpingState()) + } +} + +class JumpingState : State { + override fun move(gameCharacter: GameCharacter) { + println("캐릭터가 착지한 뒤 정지한다.") + gameCharacter.changeState(StoppingState()) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacter.kt new file mode 100644 index 0000000..d3a2370 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacter.kt @@ -0,0 +1,22 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.before + +class GameCharacter( + private var state: State = State.STOPPING +) { + fun move() { + when (state) { + State.STOPPING -> { + println("캐릭터가 이동한다.") + this.state = State.MOVING + } + State.MOVING -> { + println("캐릭터가 점프한다.") + this.state = State.JUMPING + } + State.JUMPING -> { + println("캐릭터가 착지한 뒤 정지한다.") + this.state = State.STOPPING + } + } + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacterApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacterApplication.kt new file mode 100644 index 0000000..629df44 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacterApplication.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.before + +class GameCharacterApplicationBefore + +fun main() { + val gameCharacter = GameCharacter() + gameCharacter.move() + gameCharacter.move() + gameCharacter.move() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/State.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/State.kt new file mode 100644 index 0000000..9eb021c --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/State.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.before + +enum class State { + STOPPING, + MOVING, + JUMPING, +}