diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md index 78964e1..1243bd7 100644 --- a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md @@ -143,6 +143,13 @@ ### 컴포지트(Composite) 패턴 +#### 구현 요구사항 + +- 프랜차이즈 기업의 정산은 가맹점으로 가입된 모든 가게들의 정산을 포함한다. +- 프랜차이즈 기업은 다른 프랜차이즈 기업을 포함할 수 있다. +- 프랜차이즈 기업은 이름을 갖는다. +- 프랜차이즈 가맹점은 이름을 갖는다. + ### 널(Null) 객체 패턴 ## 참고자료 diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/FranchiseeApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/FranchiseeApplication.kt new file mode 100644 index 0000000..c1e9785 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/FranchiseeApplication.kt @@ -0,0 +1,17 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.composite.after + +class FranchiseeApplication + +fun main() { + val coffeeCorporation = FranchiseeCorporation("커피프린스") + coffeeCorporation.addStore(FranchiseeStore("1호점")) + coffeeCorporation.calculate() + + println() + println("가맹점 정산을 완료했습니다.") + println() + + val franchiseeCorporation = FranchiseeCorporation("모두의 프랜차이즈") + franchiseeCorporation.addStore(coffeeCorporation) + franchiseeCorporation.calculate() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/FranchiseeCorporation.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/FranchiseeCorporation.kt new file mode 100644 index 0000000..a948dc8 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/FranchiseeCorporation.kt @@ -0,0 +1,21 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.composite.after + +class FranchiseeCorporation( + private val name: String, + private val stores: MutableList = mutableListOf() +) : Store { + fun addStore(store: Store) { + stores.add(store) + } + + fun removeStore(store: Store) { + stores.remove(store) + } + + override fun calculate() { + for (store in stores) { + store.calculate() + } + println("프랜차이즈 기업 [$name]의 정산을 완료했습니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/FranchiseeStore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/FranchiseeStore.kt new file mode 100644 index 0000000..1bef1a6 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/FranchiseeStore.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.composite.after + +class FranchiseeStore( + val name: String +) : Store { + override fun calculate() { + println("프랜차이즈 가게 [$name]이(가) 정산을 진행합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/Store.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/Store.kt new file mode 100644 index 0000000..945e67a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/after/Store.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.composite.after + +interface Store { + fun calculate() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/before/FranchiseeApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/before/FranchiseeApplication.kt new file mode 100644 index 0000000..d72c099 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/before/FranchiseeApplication.kt @@ -0,0 +1,17 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.composite.before + +class FranchiseeApplication + +fun main() { + val coffeeCorporation = FranchiseeCorporation("커피프린스") + coffeeCorporation.addStore(FranchiseeStore("1호점")) + coffeeCorporation.calculateAllStores() + + println() + println("가맹점 정산을 완료했습니다.") + println() + + val franchiseeCorporation = FranchiseeCorporation("모두의 프랜차이즈") + franchiseeCorporation.addCorporation(coffeeCorporation) + franchiseeCorporation.calculateAllCorporations() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/before/FranchiseeCorporation.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/before/FranchiseeCorporation.kt new file mode 100644 index 0000000..91994c2 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/before/FranchiseeCorporation.kt @@ -0,0 +1,37 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.composite.before + +class FranchiseeCorporation( + private val name: String, + private val corporations: MutableList = mutableListOf(), + private val stores: MutableList = mutableListOf() +) { + fun addCorporation(franchiseeCorporation: FranchiseeCorporation) { + corporations.add(franchiseeCorporation) + } + + fun removeCorporation(franchiseeCorporation: FranchiseeCorporation) { + corporations.remove(franchiseeCorporation) + } + + fun addStore(store: FranchiseeStore) { + stores.add(store) + } + + fun removeStore(store: FranchiseeStore) { + stores.remove(store) + } + + fun calculateAllCorporations() { + for (corporation in corporations) { + corporation.calculateAllStores() + } + println("프랜차이즈 기업 [$name]의 정산을 완료했습니다.") + } + + fun calculateAllStores() { + for (store in stores) { + store.calculate() + } + println("프랜차이즈 기업 [$name]의 정산을 완료했습니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/before/FranchiseeStore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/before/FranchiseeStore.kt new file mode 100644 index 0000000..d74b9b6 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/composite/before/FranchiseeStore.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.composite.before + +class FranchiseeStore( + val name: String +) { + fun calculate() { + println("프랜차이즈 가게 [$name]이(가) 정산을 진행합니다.") + } +}