From 86cd9824de46cb4db0ccf7885032cdd5f6d1bd15 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Mon, 14 Nov 2022 10:47:38 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20Design=20Pattern=20-=20=EB=AF=B8?= =?UTF-8?q?=EB=94=94=EC=97=90=EC=9D=B4=ED=84=B0(Mediator)=20=ED=8C=A8?= =?UTF-8?q?=ED=84=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solid-design-pattern-sample/README.md | 6 ++++++ .../designpattern/mediator/after/AirConditioner.kt | 11 +++++++++++ .../designpattern/mediator/after/HomeAppliance.kt | 9 +++++++++ .../mediator/after/HomeApplianceApplication.kt | 12 ++++++++++++ .../designpattern/mediator/after/MessageSender.kt | 7 +++++++ .../designpattern/mediator/after/RemoteControl.kt | 17 +++++++++++++++++ .../designpattern/mediator/after/Television.kt | 11 +++++++++++ .../designpattern/mediator/before/AirConditioner.kt | 13 +++++++++++++ .../designpattern/mediator/before/HomeAppliance.kt | 9 +++++++++ .../mediator/before/HomeApplianceApplication.kt | 11 +++++++++++ .../designpattern/mediator/before/MessageSender.kt | 7 +++++++ .../designpattern/mediator/before/Television.kt | 13 +++++++++++++ 12 files changed, 126 insertions(+) create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/AirConditioner.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/HomeAppliance.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/HomeApplianceApplication.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/MessageSender.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/RemoteControl.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/Television.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/AirConditioner.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/HomeAppliance.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/HomeApplianceApplication.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/MessageSender.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/Television.kt diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md index 1243bd7..12ba280 100644 --- a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md @@ -124,6 +124,12 @@ ### 미디에이터(Mediator) 패턴 +#### 구현 요구사항 + +- 가전제품의 전원을 제어한다. +- 가전제품의 전원은 하나만 켤 수 있고, 하나를 켜면 나머지는 모두 꺼진다. +- 가전제품을 켤 경우, 해당 가전제품의 이름을 메시지로 전송한다. + ### 파사드(Facade) 패턴 #### 구현 요구사항 diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/AirConditioner.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/AirConditioner.kt new file mode 100644 index 0000000..e675004 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/AirConditioner.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.after + +class AirConditioner(override val name: String) : HomeAppliance { + override fun turnOn() { + println("${name}을 켭니다.") + } + + override fun turnOff() { + println("${name}을 끕니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/HomeAppliance.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/HomeAppliance.kt new file mode 100644 index 0000000..5508e3b --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/HomeAppliance.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.after + +interface HomeAppliance { + val name: String + + fun turnOn() + + fun turnOff() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/HomeApplianceApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/HomeApplianceApplication.kt new file mode 100644 index 0000000..6dd23f0 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/HomeApplianceApplication.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.after + +class HomeApplianceApplication + +fun main() { + val airConditioner = AirConditioner("에어컨") + val television = Television("텔레비전") + val messageSender = MessageSender() + val remoteControl = RemoteControl(listOf(airConditioner, television), messageSender) + + remoteControl.turnOn(airConditioner) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/MessageSender.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/MessageSender.kt new file mode 100644 index 0000000..13904c7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/MessageSender.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.after + +class MessageSender { + fun sendMessage(homeAppliance: HomeAppliance) { + println("메시지 : ${homeAppliance.name}을 켰습니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/RemoteControl.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/RemoteControl.kt new file mode 100644 index 0000000..0436c4f --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/RemoteControl.kt @@ -0,0 +1,17 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.after + +class RemoteControl( + private val homeAppliances: List, + private val messageSender: MessageSender +) { + fun turnOn(homeAppliance: HomeAppliance) { + homeAppliances.filterNot { it == homeAppliance } + .forEach { it.turnOff() } + homeAppliance.turnOn() + messageSender.sendMessage(homeAppliance) + } + + fun turnOff(homeAppliance: HomeAppliance) { + homeAppliance.turnOff() + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/Television.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/Television.kt new file mode 100644 index 0000000..48366a5 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/after/Television.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.after + +class Television(override val name: String) : HomeAppliance { + override fun turnOn() { + println("${name}을 켭니다.") + } + + override fun turnOff() { + println("${name}을 끕니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/AirConditioner.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/AirConditioner.kt new file mode 100644 index 0000000..5c7e3a9 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/AirConditioner.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.before + +class AirConditioner(override val name: String) : HomeAppliance { + override fun turnOnBut(homeAppliance: HomeAppliance, messageSender: MessageSender) { + homeAppliance.turnOff() + println("${name}을 켭니다.") + messageSender.sendMessage(this) + } + + override fun turnOff() { + println("${name}을 끕니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/HomeAppliance.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/HomeAppliance.kt new file mode 100644 index 0000000..13038ed --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/HomeAppliance.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.before + +interface HomeAppliance { + val name: String + + fun turnOnBut(homeAppliance: HomeAppliance, messageSender: MessageSender) + + fun turnOff() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/HomeApplianceApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/HomeApplianceApplication.kt new file mode 100644 index 0000000..b3d2365 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/HomeApplianceApplication.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.before + +class HomeApplianceApplication + +fun main() { + val airConditioner = AirConditioner("에어컨") + val television = Television("텔레비전") + val messageSender = MessageSender() + + airConditioner.turnOnBut(television, messageSender) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/MessageSender.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/MessageSender.kt new file mode 100644 index 0000000..6068444 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/MessageSender.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.before + +class MessageSender { + fun sendMessage(homeAppliance: HomeAppliance) { + println("메시지 : ${homeAppliance.name}을 켰습니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/Television.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/Television.kt new file mode 100644 index 0000000..588ab65 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/mediator/before/Television.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.mediator.before + +class Television(override val name: String) : HomeAppliance { + override fun turnOnBut(homeAppliance: HomeAppliance, messageSender: MessageSender) { + homeAppliance.turnOff() + println("${name}을 켭니다.") + messageSender.sendMessage(this) + } + + override fun turnOff() { + println("${name}을 끕니다.") + } +}