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() +}