feat : Design Pattern - 옵저버(Observer) 패턴 구현

This commit is contained in:
banjjoknim
2022-11-12 17:14:12 +09:00
parent 826c70834d
commit 4b2d8a9669
11 changed files with 124 additions and 0 deletions

View File

@@ -115,6 +115,13 @@
### 옵저버(Observer) 패턴
#### 구현 요구사항
- 주문의 상태가 변경되면 배송팀과 운영팀에 알리고, 각각의 팀은 그에 따른 조치를 취한다.
- 배송팀은 배송을 시작한다.
- 운영팀은 고객에게 메시지를 전송한다.
- 배송팀과 운영팀 외에 다른 팀에도 필요하다면 또 다른 팀에 메시지를 전송해야 할 수도 있다.
### 미디에이터(Mediator) 패턴
### 파사드(Facade) 패턴

View File

@@ -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} 상태로 변경되었네요. 배송을 시작합니다.")
}
}

View File

@@ -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} 상태로 변경되었네요. 소비자에게 메시지를 전송합니다.")
}
}

View File

@@ -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<Team> = 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) }
}
}

View File

@@ -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)
}

View File

@@ -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)
}

View File

@@ -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} 상태로 변경되었네요. 배송을 시작합니다.")
}
}

View File

@@ -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} 상태로 변경되었네요. 소비자에게 메시지를 전송합니다.")
}
}

View File

@@ -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)
}
}

View File

@@ -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)
}

View File

@@ -0,0 +1,8 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.observer.common
enum class OrderState(
val description: String
) {
RECEIVED("접수됨"),
DELIVERY_READY_COMPLETE("배송 준비")
}