feat : Design Pattern - 널 객체(Null Object) 패턴 구현

This commit is contained in:
banjjoknim
2022-11-15 02:36:14 +09:00
parent 86cd9824de
commit beab021cfb
8 changed files with 149 additions and 1 deletions

View File

@@ -156,7 +156,13 @@
- 프랜차이즈 기업은 이름을 갖는다.
- 프랜차이즈 가맹점은 이름을 갖는다.
### 널(Null) 객체 패턴
### 널 객체(Null Object) 패턴
#### 구현 요구사항
- 식당에서는 직원을 이름으로 관리하며 동명이인은 없다고 가정한다.
- 이름으로 직원을 찾을 수 있고, 해당 직원에게 근무일자를 할당할 수 있다.
- 직원은 근무일자를 고지 받으면 해당 날짜를 기억한다.
## 참고자료

View File

@@ -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<Int>) {
// 아무 작업도 하지 않는다.
}
}
}
val name: String
var workingDays: List<Int>
get() = listOf()
set(workingDays) {
memorizeWorkingDays(workingDays)
}
fun memorizeWorkingDays(workingDays: List<Int>)
}

View File

@@ -0,0 +1,28 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.nill.after
class Restaurant(
private val employees: MutableList<Employee> = 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<Int>, employeeName: String) {
val employee = findEmployee(employeeName)
employee.memorizeWorkingDays(workingDays)
}
private fun findEmployee(employeeName: String): Employee {
return employees.find { it.name == employeeName } ?: Employee.NOT_FOUND
}
}

View File

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

View File

@@ -0,0 +1,10 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.nill.after
class WorkingEmployee(
override val name: String,
override var workingDays: List<Int> = listOf()
) : Employee {
override fun memorizeWorkingDays(workingDays: List<Int>) {
this.workingDays = workingDays
}
}

View File

@@ -0,0 +1,25 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.nill.before
class Employee(
val name: String,
var workingDays: List<Int> = listOf()
) {
fun memorizeWorkingDays(workingDays: List<Int>) {
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()
}
}

View File

@@ -0,0 +1,30 @@
package com.banjjoknim.soliddesignpatternsample.designpattern.nill.before
class Restaurant(
private val employees: MutableList<Employee> = 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<Int>, employeeName: String) {
val employee = findEmployee(employeeName)
if (employee != null) {
employee.memorizeWorkingDays(workingDays)
}
}
private fun findEmployee(employeeName: String): Employee? {
return employees.find { it.name == employeeName }
}
}

View File

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