diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md index 2037f4e..7c410f4 100644 --- a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md @@ -115,6 +115,13 @@ ### 옵저버(Observer) 패턴 +#### 구현 요구사항 + +- 주문의 상태가 변경되면 배송팀과 운영팀에 알리고, 각각의 팀은 그에 따른 조치를 취한다. + - 배송팀은 배송을 시작한다. + - 운영팀은 고객에게 메시지를 전송한다. +- 배송팀과 운영팀 외에 다른 팀에도 필요하다면 또 다른 팀에 메시지를 전송해야 할 수도 있다. + ### 미디에이터(Mediator) 패턴 ### 파사드(Facade) 패턴 diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/DeliveryTeam.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/DeliveryTeam.kt new file mode 100644 index 0000000..8212d2a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/DeliveryTeam.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class DeliveryTeam : Team { + override val name: String + get() = "배송팀" + + override fun onNotice(state: OrderState) { + println("$name : 주문이 ${state.description} 상태로 변경되었네요. 배송을 시작합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/ManageTeam.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/ManageTeam.kt new file mode 100644 index 0000000..66567f7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/ManageTeam.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class ManageTeam : Team { + override val name: String + get() = "운영팀" + + override fun onNotice(state: OrderState) { + println("$name : 주문이 ${state.description} 상태로 변경되었네요. 소비자에게 메시지를 전송합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Order.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Order.kt new file mode 100644 index 0000000..2f94bda --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Order.kt @@ -0,0 +1,21 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class Order( + private var state: OrderState = OrderState.RECEIVED, + private val teams: MutableList = mutableListOf() +) { + fun addTeam(team: Team) { + this.teams.add(team) + } + + fun removeTeam(team: Team) { + this.teams.remove(team) + } + + fun changeState(state: OrderState) { + this.state = state + teams.forEach { it.onNotice(state) } + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/OrderApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/OrderApplication.kt new file mode 100644 index 0000000..d0cb1be --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/OrderApplication.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class OrderApplication + +fun main() { + val order = Order() + order.addTeam(DeliveryTeam()) + order.addTeam(ManageTeam()) + order.changeState(OrderState.DELIVERY_READY_COMPLETE) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Team.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Team.kt new file mode 100644 index 0000000..0cd62e0 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Team.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +interface Team { + val name: String + + fun onNotice(state: OrderState) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/DeliveryTeam.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/DeliveryTeam.kt new file mode 100644 index 0000000..2a45e16 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/DeliveryTeam.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class DeliveryTeam { + fun doDelivery(state: OrderState) { + println("배송팀 : 주문이 ${state.description} 상태로 변경되었네요. 배송을 시작합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/ManageTeam.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/ManageTeam.kt new file mode 100644 index 0000000..3bd03c1 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/ManageTeam.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class ManageTeam { + fun sendMessage(state: OrderState) { + println("운영팀 : 주문이 ${state.description} 상태로 변경되었네요. 소비자에게 메시지를 전송합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/Order.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/Order.kt new file mode 100644 index 0000000..1596d73 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/Order.kt @@ -0,0 +1,15 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class Order( + private var state: OrderState = OrderState.RECEIVED, + private val deliveryTeam: DeliveryTeam, + private val manageTeam: ManageTeam +) { + fun changeState(state: OrderState) { + this.state = state + deliveryTeam.doDelivery(state) + manageTeam.sendMessage(state) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/OrderApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/OrderApplication.kt new file mode 100644 index 0000000..7bf2021 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/OrderApplication.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class OrderApplication + +fun main() { + val order = Order(state = OrderState.RECEIVED, DeliveryTeam(), ManageTeam()) + order.changeState(OrderState.DELIVERY_READY_COMPLETE) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/common/OrderState.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/common/OrderState.kt new file mode 100644 index 0000000..ab881ad --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/common/OrderState.kt @@ -0,0 +1,8 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.common + +enum class OrderState( + val description: String +) { + RECEIVED("접수됨"), + DELIVERY_READY_COMPLETE("배송 준비") +}