From beab021cfb9e8c5dfc83b5dae80019a566b9d239 Mon Sep 17 00:00:00 2001 From: banjjoknim Date: Tue, 15 Nov 2022 02:36:14 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20Design=20Pattern=20-=20=EB=84=90=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4(Null=20Object)=20=ED=8C=A8=ED=84=B4=20?= =?UTF-8?q?=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 | 8 ++++- .../designpattern/nill/after/Employee.kt | 23 ++++++++++++++ .../designpattern/nill/after/Restaurant.kt | 28 +++++++++++++++++ .../designpattern/nill/after/RestaurantApplication.kt | 13 ++++++++ .../designpattern/nill/after/WorkingEmployee.kt | 10 +++++++ .../designpattern/nill/before/Employee.kt | 25 ++++++++++++++++ .../designpattern/nill/before/Restaurant.kt | 30 +++++++++++++++++++ .../designpattern/nill/before/RestaurantApplication.kt | 13 ++++++++ 8 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/Employee.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/Restaurant.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/RestaurantApplication.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/WorkingEmployee.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/Employee.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/Restaurant.kt create mode 100644 놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/RestaurantApplication.kt diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md index 12ba280..8eb2da2 100644 --- a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md @@ -156,7 +156,13 @@ - 프랜차이즈 기업은 이름을 갖는다. - 프랜차이즈 가맹점은 이름을 갖는다. -### 널(Null) 객체 패턴 +### 널 객체(Null Object) 패턴 + +#### 구현 요구사항 + +- 식당에서는 직원을 이름으로 관리하며 동명이인은 없다고 가정한다. +- 이름으로 직원을 찾을 수 있고, 해당 직원에게 근무일자를 할당할 수 있다. +- 직원은 근무일자를 고지 받으면 해당 날짜를 기억한다. ## 참고자료 diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/Employee.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/Employee.kt new file mode 100644 index 0000000..48d717d --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/Employee.kt @@ -0,0 +1,23 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.nill.after + +interface Employee { + companion object { + val NOT_FOUND = object : Employee { + override val name: String + get() = "존재하지 않음" + + override fun memorizeWorkingDays(workingDays: List) { + // 아무 작업도 하지 않는다. + } + } + } + + val name: String + var workingDays: List + get() = listOf() + set(workingDays) { + memorizeWorkingDays(workingDays) + } + + fun memorizeWorkingDays(workingDays: List) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/Restaurant.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/Restaurant.kt new file mode 100644 index 0000000..aaf15ca --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/Restaurant.kt @@ -0,0 +1,28 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.nill.after + +class Restaurant( + private val employees: MutableList = mutableListOf() +) { + fun addEmployee(employee: Employee) { + employees.add(employee) + } + + fun removeEmployee(employee: Employee) { + employees.remove(employee) + } + + fun showAllEmployeesWorkingDays() { + for (employee in employees) { + println("${employee.name}의 근무일은 ${employee.workingDays}일 입니다.") + } + } + + fun assignWorkingDays(workingDays: List, employeeName: String) { + val employee = findEmployee(employeeName) + employee.memorizeWorkingDays(workingDays) + } + + private fun findEmployee(employeeName: String): Employee { + return employees.find { it.name == employeeName } ?: Employee.NOT_FOUND + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/RestaurantApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/RestaurantApplication.kt new file mode 100644 index 0000000..4df3fea --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/RestaurantApplication.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.nill.after + +class RestaurantApplication + +fun main() { + val restaurant = Restaurant() + restaurant.addEmployee(WorkingEmployee("banjjoknim")) + + restaurant.assignWorkingDays(listOf(1, 4, 7, 14, 20, 27), "banjjoknim") + restaurant.assignWorkingDays(listOf(2, 5, 10, 17, 23, 29), "colt") + + restaurant.showAllEmployeesWorkingDays() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/WorkingEmployee.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/WorkingEmployee.kt new file mode 100644 index 0000000..29ebe6c --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/after/WorkingEmployee.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.nill.after + +class WorkingEmployee( + override val name: String, + override var workingDays: List = listOf() +) : Employee { + override fun memorizeWorkingDays(workingDays: List) { + this.workingDays = workingDays + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/Employee.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/Employee.kt new file mode 100644 index 0000000..7324fdd --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/Employee.kt @@ -0,0 +1,25 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.nill.before + +class Employee( + val name: String, + var workingDays: List = listOf() +) { + fun memorizeWorkingDays(workingDays: List) { + this.workingDays = workingDays + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as Employee + + if (name != other.name) return false + + return true + } + + override fun hashCode(): Int { + return name.hashCode() + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/Restaurant.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/Restaurant.kt new file mode 100644 index 0000000..5fa0dc2 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/Restaurant.kt @@ -0,0 +1,30 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.nill.before + +class Restaurant( + private val employees: MutableList = mutableListOf() +) { + fun addEmployee(employee: Employee) { + employees.add(employee) + } + + fun removeEmployee(employee: Employee) { + employees.remove(employee) + } + + fun showAllEmployeesWorkingDays() { + for (employee in employees) { + println("${employee.name}의 근무일은 ${employee.workingDays}일 입니다.") + } + } + + fun assignWorkingDays(workingDays: List, employeeName: String) { + val employee = findEmployee(employeeName) + if (employee != null) { + employee.memorizeWorkingDays(workingDays) + } + } + + private fun findEmployee(employeeName: String): Employee? { + return employees.find { it.name == employeeName } + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/RestaurantApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/RestaurantApplication.kt new file mode 100644 index 0000000..fe9c11b --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/nill/before/RestaurantApplication.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.nill.before + +class RestaurantApplication + +fun main() { + val restaurant = Restaurant() + restaurant.addEmployee(Employee("banjjoknim")) + + restaurant.assignWorkingDays(listOf(1, 4, 7, 14, 20, 27), "banjjoknim") + restaurant.assignWorkingDays(listOf(2, 5, 10, 17, 23, 29), "colt") + + restaurant.showAllEmployeesWorkingDays() +}