diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/.gitignore b/놀이터(예제 코드 작성)/solid-design-pattern-sample/.gitignore new file mode 100644 index 0000000..c2065bc --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md new file mode 100644 index 0000000..00d7130 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/README.md @@ -0,0 +1,178 @@ +# SOLID & Design Pattern Sample + +## SOLID + +- SOLID 원칙들은 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩터링하여 코드 냄새를 제거하기 위해 적용할 수 있는 지침이다. +- 각 항목별 before & after 를 비교하면서 어떤 차이가 있는지 생각해본다. +- before & after 에 새로운, 또는 동일한 규칙(비즈니스 로직, 유효성 검사 등)을 적용해야 한다고 가정하고 변경을 시도해본다. + +### SRP(Single Responsibility Principle) + +- 단일 책임 원칙 +- 한 클래스는 하나의 책임만 가져야 한다. 즉, 한 클래스가 변경되는 이유는 한 가지여야 한다. + +#### 구현 요구사항 + +- 예금주의 이름으로 계좌를 생성할 수 있다. +- 계좌에 입금할 수 있다. +- 계좌에서 출금할 수 있다. + +### OCP(Open/Closed Principle) + +- 개방-폐쇄 원칙 +- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. + +#### 구현 요구사항 + +- 최초의 결제방식은 현금, 카드 두 가지가 있다. +- 쿠폰 결제방식을 추가한다고 가정한다. +- 쿠폰으로 결제할 경우 잔고가 차감되지 않는다. + +### LSP(Liskov Substitution Principle) + +- 리스코프 치환 원칙 +- 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. + +#### 구현 요구사항 + +- 좌표를 입력하면 해당 좌표로 이동수단의 위치가 변한다. + +### ISP(Interface Segregation Principle) + +- 인터페이스 분리 원칙 +- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다. + +#### 구현 요구사항 + +- 영화 상영관 좌석 현황을 조회할 수 있다. +- 영화표 예매를 진행할 수 있다. + +### DIP(Dependency Inversion Principle) + +- 의존 역전 원칙 +- 프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.” 의존성 주입은 이 원칙을 따르는 방법 중 하나다. + +#### 구현 요구사항 + +- 저장소에서 파일 데이터를 불러올 수 있다. +- 하나의 저장소만 사용하며 저장소의 타입은 언제든지 변경될 수 있다. +- 각각의 저장소는 각자만의 파일 데이터 조회 요청 인터페이스를 제공한다. + - 아마존에서는 파일 이름을 요구한다. + - 구글에서는 파일 번호를 요구한다. + +## Design Pattern + +### 전략(Strategy) 패턴 + +#### 구현 요구사항 + +- 연령대별로 물건의 할인된 금액 계산기를 구현한다. + - 아이일 경우 할인율은 15%이다. + - 어른일 경우 할인율은 30%이다. + +### 템플릿 메서드(Template Method) 패턴 + +#### 구현 요구사항 + +- 스포츠 강사를 구현한다. + - 모든 강사는 강의가 시작할 때 스트레칭을 한다. + - 모든 강사는 강의가 끝날 때 인사한다. + - 수영 강사는 강의 중간에 수영 동작을 보여준다. + - 축구 강사는 강의 중간에 축구 동작을 보여준다. + +### 상태(State) 패턴 + +#### 구현 요구사항 + +- 상태별로 다르게 움직이는 게임 캐릭터를 구현한다. + - 기본적으로 게임 캐릭터는 정지상태이다. + - 정지 상태에서 버튼을 누르면 이동한다. + - 이동하는 상태에서 버튼을 누르면 점프한다. + - 점프하는 상태에서 버튼을 누르면 착지한 뒤 정지한다. + - 게임 캐릭터는 버튼을 누르면 동작하는 상태로 스스로의 상태를 변경한다. + +### 데코레이터(Decorator) 패턴 + +#### 구현 요구사항 + +- 용사는 검을 가진다. +- 용사는 검을 바꿀 수 있다. +- 검에는 속성이 부여될 수 있으며, 속성에 따라 공격이 변한다. +- 용사가 공격하면 소지한 무기의 공격이 발동된다. + +### 프록시(Proxy) 패턴 + +#### 구현 요구사항 + +- 지갑의 주인은 지갑에 대해 입금 또는 출금을 진행할 수 있다. +- 지갑의 동작은 입금 및 출금만 가능하도록 제한된다. +- 지갑에 대해 입금 또는 출금이 이루어질 때 메시지를 출력한다. + +### 어댑터(Adapter) 패턴 + +#### 구현 요구사항 + +- 발전소는 정해진 요청 규격에 따라 전기를 생산한다. +- 가정은 정해진 규격에 따라 전기를 얻는다. +- 발전소와 가정에서 사용하는 전기는 각각 다르다. +- 발전소에서 생산한 전기를 가정용으로 변환하는 계산식은 아래와 같다. + - 생산된 전류량 * (발전소 전압 / 가정용 전압) + - 발전소에서 생산한 전기의 전압은 11000V 이다. + - 가정에서 사용하는 전기의 전압은 220V 이다. + +### 옵저버(Observer) 패턴 + +#### 구현 요구사항 + +- 주문의 상태가 변경되면 배송팀과 운영팀에 알리고, 각각의 팀은 그에 따른 조치를 취한다. + - 배송팀은 배송을 시작한다. + - 운영팀은 고객에게 메시지를 전송한다. +- 배송팀과 운영팀 외에 다른 팀에도 필요하다면 또 다른 팀에 메시지를 전송해야 할 수도 있다. + +### 미디에이터(Mediator) 패턴 + +#### 구현 요구사항 + +- 가전제품의 전원을 제어한다. +- 가전제품의 전원은 하나만 켤 수 있고, 하나를 켜면 나머지는 모두 꺼진다. +- 가전제품을 켤 경우, 해당 가전제품의 이름을 메시지로 전송한다. + +### 파사드(Facade) 패턴 + +#### 구현 요구사항 + +- 회원의 모든 정보를 조회한다. +- 회원의 모든 정보에는 회원의 기본 정보와 친구들에 대한 정보가 있다. + - 회원의 기본 정보에는 이름, 나이가 있다. + - 회원의 친구 정보에는 친구의 이름, 나이가 있다. + +### 추상 팩토리(Abstract Factory) 패턴 + +#### 구현 요구사항 + +- 과일 이름을 입력하면 해당 과일 또는 과일주스를 만들어주는 마법이 있다. +- 과일의 종류는 사과, 바나나, 오렌지로 총 세 가지다. +- 과일주스의 종류도 마찬가지로 사과주스, 바나나주스, 오렌즈주스로 총 세 가지다. + +### 컴포지트(Composite) 패턴 + +#### 구현 요구사항 + +- 프랜차이즈 기업의 정산은 가맹점으로 가입된 모든 가게들의 정산을 포함한다. +- 프랜차이즈 기업은 다른 프랜차이즈 기업을 포함할 수 있다. +- 프랜차이즈 기업은 이름을 갖는다. +- 프랜차이즈 가맹점은 이름을 갖는다. + +### 널 객체(Null Object) 패턴 + +#### 구현 요구사항 + +- 식당에서는 직원을 이름으로 관리하며 동명이인은 없다고 가정한다. +- 이름으로 직원을 찾을 수 있고, 해당 직원에게 근무일자를 할당할 수 있다. +- 직원은 근무일자를 고지 받으면 해당 날짜를 기억한다. + +## 참고자료 + +- [SOLID (객체 지향 설계)](https://ko.wikipedia.org/wiki/SOLID_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%EC%84%A4%EA%B3%84)) + + diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/build.gradle.kts b/놀이터(예제 코드 작성)/solid-design-pattern-sample/build.gradle.kts new file mode 100644 index 0000000..b6813a1 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/build.gradle.kts @@ -0,0 +1,39 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id("org.springframework.boot") version "2.7.5" + id("io.spring.dependency-management") version "1.0.15.RELEASE" + kotlin("jvm") version "1.6.21" + kotlin("plugin.spring") version "1.6.21" + kotlin("plugin.jpa") version "1.6.21" +} + +group = "com.banjjoknim" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_11 + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.boot:spring-boot-starter-validation") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + runtimeOnly("com.h2database:h2") + testImplementation("org.springframework.boot:spring-boot-starter-test") +} + +tasks.withType { + kotlinOptions { + freeCompilerArgs = listOf("-Xjsr305=strict") + jvmTarget = "11" + } +} + +tasks.withType { + useJUnitPlatform() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradle/wrapper/gradle-wrapper.jar b/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..249e583 Binary files /dev/null and b/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradle/wrapper/gradle-wrapper.jar differ diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradle/wrapper/gradle-wrapper.properties b/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ae04661 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradlew b/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradlew new file mode 100755 index 0000000..a69d9cb --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradlew @@ -0,0 +1,240 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradlew.bat b/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradlew.bat new file mode 100644 index 0000000..f127cfd --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/gradlew.bat @@ -0,0 +1,91 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/settings.gradle.kts b/놀이터(예제 코드 작성)/solid-design-pattern-sample/settings.gradle.kts new file mode 100644 index 0000000..80d1c28 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "solid-design-pattern-sample" diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/SolidDesignPatternSampleApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/SolidDesignPatternSampleApplication.kt new file mode 100644 index 0000000..8b19534 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/SolidDesignPatternSampleApplication.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication + +@SpringBootApplication +class SolidDesignPatternSampleApplication + +fun main(args: Array) { + runApplication(*args) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/AppleMagic.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/AppleMagic.kt new file mode 100644 index 0000000..4c9a14f --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/AppleMagic.kt @@ -0,0 +1,16 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Apple +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.AppleJuice + +class AppleMagic : Magic { + override fun createFruit() { + val apple = Apple() + println("과일 [${apple.name}]를 만들었습니다!") + } + + override fun createJuice() { + val appleJuice = AppleJuice() + println("과일주스 [${appleJuice.name}]을 만들었습니다!") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/BananaMagic.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/BananaMagic.kt new file mode 100644 index 0000000..3e2ff42 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/BananaMagic.kt @@ -0,0 +1,16 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Banana +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.BananaJuice + +class BananaMagic : Magic { + override fun createFruit() { + val banana = Banana() + println("과일 [${banana.name}]를 만들었습니다!") + } + + override fun createJuice() { + val bananaJuice = BananaJuice() + println("과일주스 [${bananaJuice.name}]을 만들었습니다!") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/Magic.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/Magic.kt new file mode 100644 index 0000000..2619de6 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/Magic.kt @@ -0,0 +1,35 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.FruitType + +interface Magic { + companion object { + fun getMagic(fruitType: FruitType): Magic { + return when (fruitType) { + FruitType.APPLE -> AppleMagic() + FruitType.BANANA -> BananaMagic() + FruitType.ORANGE -> OrangeMagic() + } + } + } + + fun createFruit() + + fun createJuice() +} + +//abstract class Magic { +// companion object { +// fun getMagic(fruitType: FruitType): Magic { +// return when (fruitType) { +// FruitType.APPLE -> AppleMagic() +// FruitType.BANANA -> BananaMagic() +// FruitType.ORANGE -> OrangeMagic() +// } +// } +// } +// +// abstract fun createFruit() +// +// abstract fun createJuice() +//} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/MagicApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/MagicApplication.kt new file mode 100644 index 0000000..8b84596 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/MagicApplication.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.FruitType + +class MagicApplication + +fun main() { + val fruitType = FruitType.APPLE + val magic = Magic.getMagic(fruitType) + magic.createFruit() + magic.createJuice() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/OrangeMagic.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/OrangeMagic.kt new file mode 100644 index 0000000..416a5c7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/after/OrangeMagic.kt @@ -0,0 +1,16 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Orange +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.OrangeJuice + +class OrangeMagic : Magic { + override fun createFruit() { + val orange = Orange() + println("과일 [${orange.name}]를 만들었습니다!") + } + + override fun createJuice() { + val orangeJuice = OrangeJuice() + println("과일주스 [${orangeJuice.name}]을 만들었습니다!") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/Magic.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/Magic.kt new file mode 100644 index 0000000..c862ffe --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/Magic.kt @@ -0,0 +1,29 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Apple +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.AppleJuice +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Banana +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.BananaJuice +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.FruitType +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.Orange +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.OrangeJuice + +class Magic { + fun createFruit(type: FruitType) { + val fruit = when (type) { + FruitType.APPLE -> Apple() + FruitType.BANANA -> Banana() + FruitType.ORANGE -> Orange() + } + println("과일 [${fruit.name}]를 만들었습니다!") + } + + fun createJuice(type: FruitType) { + val juice = when (type) { + FruitType.APPLE -> AppleJuice() + FruitType.BANANA -> BananaJuice() + FruitType.ORANGE -> OrangeJuice() + } + println("과일주스 [${juice.name}]을 만들었습니다!") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/MagicApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/MagicApplication.kt new file mode 100644 index 0000000..8024408 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/before/MagicApplication.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common.FruitType + +class MagicApplication + +fun main() { + val magic = Magic() + val fruitType = FruitType.APPLE + magic.createFruit(fruitType) + magic.createJuice(fruitType) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/FruitType.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/FruitType.kt new file mode 100644 index 0000000..75c7333 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/FruitType.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common + +enum class FruitType { + APPLE, + BANANA, + ORANGE +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Fruits.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Fruits.kt new file mode 100644 index 0000000..e83951a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Fruits.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common + +interface Fruit { + val name: String +} + +data class Apple(override val name: String = "사과") : Fruit + +data class Banana(override val name: String = "바나나") : Fruit + +data class Orange(override val name: String = "오렌지") : Fruit diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Juices.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Juices.kt new file mode 100644 index 0000000..2f266f3 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/abstractfactory/common/Juices.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.abstractfactory.common + +interface Juice { + val name: String +} + +data class AppleJuice(override val name: String = "사과주스") : Juice + +data class BananaJuice(override val name: String = "바나나주스") : Juice + +data class OrangeJuice(override val name: String = "오렌지주스") : Juice diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/after/ElectricService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/after/ElectricService.kt new file mode 100644 index 0000000..101915e --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/after/ElectricService.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.adapter.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common.HomeElectric + +interface ElectricService { + fun generateElectric(current: Int): HomeElectric +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/after/HomePowerStationElectricAdapter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/after/HomePowerStationElectricAdapter.kt new file mode 100644 index 0000000..5d0d7be --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/after/HomePowerStationElectricAdapter.kt @@ -0,0 +1,15 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.adapter.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common.HomeElectric +import com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common.PowerStation +import com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common.PowerStationElectricRequest + +class HomePowerStationElectricAdapter( + private val powerStation: PowerStation +): ElectricService { + override fun generateElectric(current: Int): HomeElectric { + val powerStationElectricRequest = PowerStationElectricRequest(current) + val powerStationElectric = powerStation.generateElectric(powerStationElectricRequest) + return powerStationElectric.toHomeElectric() + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/after/PowerStationApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/after/PowerStationApplication.kt new file mode 100644 index 0000000..3deeb2a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/after/PowerStationApplication.kt @@ -0,0 +1,16 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.adapter.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common.Home +import com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common.PowerStation + +class PowerStationApplication + +fun main() { + val powerStation = PowerStation() + val homePowerStationElectricAdapter = HomePowerStationElectricAdapter(powerStation) + + val homeElectric = homePowerStationElectricAdapter.generateElectric(1000) + + val home = Home() + home.takeElectric(homeElectric) // 가정은 발전소의 전기를 사용하는 클라이언트 역할을 한다. +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/before/PowerStationApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/before/PowerStationApplication.kt new file mode 100644 index 0000000..d4ff732 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/before/PowerStationApplication.kt @@ -0,0 +1,19 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.adapter.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common.Home +import com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common.PowerStation +import com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common.PowerStationElectricRequest + +class PowerStationApplication + +fun main() { + val powerStation = PowerStation() + + val electricRequest = PowerStationElectricRequest(1000) + val powerStationElectric = powerStation.generateElectric(electricRequest) + + val homeElectric = powerStationElectric.toHomeElectric() + + val home = Home() + home.takeElectric(homeElectric) // 가정은 발전소의 전기를 사용하는 클라이언트 역할을 한다. +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/Home.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/Home.kt new file mode 100644 index 0000000..d9aea56 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/Home.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common + +class Home( + private var electric: HomeElectric = HomeElectric(0) +) { + fun takeElectric(electric: HomeElectric) { + this.electric = electric + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/HomeElectric.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/HomeElectric.kt new file mode 100644 index 0000000..d4bfc8d --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/HomeElectric.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common + +data class HomeElectric( + val current: Int, +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/PowerStation.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/PowerStation.kt new file mode 100644 index 0000000..b75ece9 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/PowerStation.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common + +class PowerStation { + fun generateElectric(request: PowerStationElectricRequest): PowerStationElectric { + return PowerStationElectric(request.current) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/PowerStationElectric.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/PowerStationElectric.kt new file mode 100644 index 0000000..5f93f21 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/PowerStationElectric.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common + +data class PowerStationElectric( + val current: Int, +) { + fun toHomeElectric(): HomeElectric { + return HomeElectric(this.current * (11000 / 220)) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/PowerStationElectricRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/PowerStationElectricRequest.kt new file mode 100644 index 0000000..f4f87cf --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/adapter/common/PowerStationElectricRequest.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.adapter.common + +data class PowerStationElectricRequest( + val current: Int +) 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]이(가) 정산을 진행합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Fire.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Fire.kt new file mode 100644 index 0000000..73dc3f2 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Fire.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword + +class Fire(private val sword: Sword) : SwordDecorator() { + override fun skill(): String { + return "불꽃 ${sword.skill()}" + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/HeroApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/HeroApplication.kt new file mode 100644 index 0000000..d7b635a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/HeroApplication.kt @@ -0,0 +1,23 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Hero +import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword + +class HeroApplication + +fun main() { + val hero = Hero() + hero.attack() + + val fireSword = Fire(Sword.DEFAULT) + hero.changeSword(fireSword) + hero.attack() + + val iceSword = Ice(Sword.DEFAULT) + hero.changeSword(iceSword) + hero.attack() + + val fireIceSword = Fire(Ice(Sword.DEFAULT)) + hero.changeSword(fireIceSword) + hero.attack() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Ice.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Ice.kt new file mode 100644 index 0000000..726c1a7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/Ice.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword + +class Ice(private val sword: Sword) : SwordDecorator() { + override fun skill(): String { + return "얼음 ${sword.skill()}" + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/SwordDecorator.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/SwordDecorator.kt new file mode 100644 index 0000000..e1ced59 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/after/SwordDecorator.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword + +abstract class SwordDecorator : Sword() diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireIceSword.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireIceSword.kt new file mode 100644 index 0000000..6e9b463 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireIceSword.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword + +class FireIceSword : Sword() { + override fun skill(): String { + return "화염 얼음 ${DEFAULT.skill()}" + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireSword.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireSword.kt new file mode 100644 index 0000000..f6c3306 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/FireSword.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword + +class FireSword : Sword() { + override fun skill(): String { + return "화염 ${DEFAULT.skill()}" + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/HeroApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/HeroApplication.kt new file mode 100644 index 0000000..5223d16 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/HeroApplication.kt @@ -0,0 +1,22 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Hero + +class HeroApplication + +fun main() { + val hero = Hero() + hero.attack() + + val fireSword = FireSword() + hero.changeSword(fireSword) + hero.attack() + + val iceSword = IceSword() + hero.changeSword(iceSword) + hero.attack() + + val fireIceSword = FireIceSword() + hero.changeSword(fireIceSword) + hero.attack() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/IceSword.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/IceSword.kt new file mode 100644 index 0000000..1ebe6f7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/before/IceSword.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common.Sword + +class IceSword : Sword() { + override fun skill(): String { + return "얼음 ${DEFAULT.skill()}" + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Hero.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Hero.kt new file mode 100644 index 0000000..ff38811 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Hero.kt @@ -0,0 +1,14 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common + +class Hero( + private var sword: Sword = Sword.DEFAULT +) { + fun changeSword(sword: Sword) { + this.sword = sword + } + + fun attack() { + val swordSkill = sword.skill() + println("용사가 [$swordSkill]을 발동합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Sword.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Sword.kt new file mode 100644 index 0000000..5d622f6 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/decorator/common/Sword.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.decorator.common + +abstract class Sword { + abstract fun skill(): String + + companion object { + val DEFAULT = object : Sword() { + override fun skill(): String { + return "참격" + } + } + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/after/InformationFinder.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/after/InformationFinder.kt new file mode 100644 index 0000000..ee8103e --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/after/InformationFinder.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.Information + +interface InformationFinder { + fun findInformation(): Information +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/after/MemberApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/after/MemberApplication.kt new file mode 100644 index 0000000..ccd0fd1 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/after/MemberApplication.kt @@ -0,0 +1,16 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.FriendFinder +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.MemberFinder + +class MemberApplication + +fun main() { + val memberFinder = MemberFinder() + val friendFinder = FriendFinder() + + val memberInformationFinder = MemberInformationFinder(memberFinder, friendFinder) + + val memberInformation = memberInformationFinder.findInformation() + println(memberInformation) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/after/MemberInformationFinder.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/after/MemberInformationFinder.kt new file mode 100644 index 0000000..92ae124 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/after/MemberInformationFinder.kt @@ -0,0 +1,17 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.FriendFinder +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.Information +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.MemberFinder +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.MemberInformation + +class MemberInformationFinder( + private val memberFinder: MemberFinder, + private val friendFinder: FriendFinder, +): InformationFinder { + override fun findInformation(): Information { + val member = memberFinder.findMember() + val friends = friendFinder.findFriends(member) + return MemberInformation(member, friends) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/before/MemberApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/before/MemberApplication.kt new file mode 100644 index 0000000..b247b37 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/before/MemberApplication.kt @@ -0,0 +1,18 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.FriendFinder +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.MemberFinder +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.MemberInformation + +class MemberApplication + +fun main() { + val memberFinder = MemberFinder() + val friendFinder = FriendFinder() + + val member = memberFinder.findMember() + val friends = friendFinder.findFriends(member) + + val memberInformation = MemberInformation(member, friends) + println(memberInformation) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/Friend.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/Friend.kt new file mode 100644 index 0000000..7c3f4c6 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/Friend.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.common + +data class Friend( + val name: String, + val age: Int +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/FriendFinder.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/FriendFinder.kt new file mode 100644 index 0000000..c19a76e --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/FriendFinder.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.common + +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.Friend +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.Member + +class FriendFinder { + fun findFriends(member: Member): List { + return listOf(Friend("colt", 29)) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/FriendInformation.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/FriendInformation.kt new file mode 100644 index 0000000..5b673bc --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/FriendInformation.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.common + +data class FriendInformation( + val name: String, + val age: Int +) : Information { + constructor(friend: Friend) : this( + name = friend.name, + age = friend.age + ) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/Information.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/Information.kt new file mode 100644 index 0000000..ccc810d --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/Information.kt @@ -0,0 +1,3 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.common + +interface Information diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/Member.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/Member.kt new file mode 100644 index 0000000..c047f55 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/Member.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.common + +class Member( + val name: String, + val age: Int +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/MemberFinder.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/MemberFinder.kt new file mode 100644 index 0000000..c8f70dc --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/MemberFinder.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.common + +import com.banjjoknim.soliddesignpatternsample.designpattern.facade.common.Member + +class MemberFinder { + fun findMember(): Member { + return Member("banjjoknim", 29) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/MemberInformation.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/MemberInformation.kt new file mode 100644 index 0000000..c83ba2b --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/facade/common/MemberInformation.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.facade.common + +data class MemberInformation( + val memberName: String, + val memberAge: Int, + val friendsInformation: List +): Information { + constructor(member: Member, friends: List) : this( + memberName = member.name, + memberAge = member.age, + friendsInformation = friends.map { FriendInformation(it) } + ) +} 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}을 끕니다.") + } +} 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() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/DeliveryTeam.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/DeliveryTeam.kt new file mode 100644 index 0000000..8212d2a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/DeliveryTeam.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class DeliveryTeam : Team { + override val name: String + get() = "배송팀" + + override fun onNotice(state: OrderState) { + println("$name : 주문이 ${state.description} 상태로 변경되었네요. 배송을 시작합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/ManageTeam.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/ManageTeam.kt new file mode 100644 index 0000000..66567f7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/ManageTeam.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class ManageTeam : Team { + override val name: String + get() = "운영팀" + + override fun onNotice(state: OrderState) { + println("$name : 주문이 ${state.description} 상태로 변경되었네요. 소비자에게 메시지를 전송합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Order.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Order.kt new file mode 100644 index 0000000..2f94bda --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Order.kt @@ -0,0 +1,21 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class Order( + private var state: OrderState = OrderState.RECEIVED, + private val teams: MutableList = mutableListOf() +) { + fun addTeam(team: Team) { + this.teams.add(team) + } + + fun removeTeam(team: Team) { + this.teams.remove(team) + } + + fun changeState(state: OrderState) { + this.state = state + teams.forEach { it.onNotice(state) } + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/OrderApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/OrderApplication.kt new file mode 100644 index 0000000..d0cb1be --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/OrderApplication.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class OrderApplication + +fun main() { + val order = Order() + order.addTeam(DeliveryTeam()) + order.addTeam(ManageTeam()) + order.changeState(OrderState.DELIVERY_READY_COMPLETE) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Team.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Team.kt new file mode 100644 index 0000000..0cd62e0 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/after/Team.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.after + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +interface Team { + val name: String + + fun onNotice(state: OrderState) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/DeliveryTeam.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/DeliveryTeam.kt new file mode 100644 index 0000000..2a45e16 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/DeliveryTeam.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class DeliveryTeam { + fun doDelivery(state: OrderState) { + println("배송팀 : 주문이 ${state.description} 상태로 변경되었네요. 배송을 시작합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/ManageTeam.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/ManageTeam.kt new file mode 100644 index 0000000..3bd03c1 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/ManageTeam.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class ManageTeam { + fun sendMessage(state: OrderState) { + println("운영팀 : 주문이 ${state.description} 상태로 변경되었네요. 소비자에게 메시지를 전송합니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/Order.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/Order.kt new file mode 100644 index 0000000..1596d73 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/Order.kt @@ -0,0 +1,15 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class Order( + private var state: OrderState = OrderState.RECEIVED, + private val deliveryTeam: DeliveryTeam, + private val manageTeam: ManageTeam +) { + fun changeState(state: OrderState) { + this.state = state + deliveryTeam.doDelivery(state) + manageTeam.sendMessage(state) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/OrderApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/OrderApplication.kt new file mode 100644 index 0000000..7bf2021 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/before/OrderApplication.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.before + +import com.banjjoknim.soliddesignpatternsample.designpattern.observer.common.OrderState + +class OrderApplication + +fun main() { + val order = Order(state = OrderState.RECEIVED, DeliveryTeam(), ManageTeam()) + order.changeState(OrderState.DELIVERY_READY_COMPLETE) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/common/OrderState.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/common/OrderState.kt new file mode 100644 index 0000000..ab881ad --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/observer/common/OrderState.kt @@ -0,0 +1,8 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.observer.common + +enum class OrderState( + val description: String +) { + RECEIVED("접수됨"), + DELIVERY_READY_COMPLETE("배송 준비") +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/ExtendsProxyWallet.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/ExtendsProxyWallet.kt new file mode 100644 index 0000000..1a3e5ed --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/ExtendsProxyWallet.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.proxy.after + +class ExtendsProxyWallet(balance: Int) : RealWallet(balance) { + override fun deposit(amount: Int) { + println("지갑에 $amount 원이 입금되었습니다.") + super.deposit(amount) + } + + override fun withdrawal(amount: Int) { + println("지갑에서 $amount 원이 출금되었습니다.") + super.withdrawal(amount) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/ImplementsProxyWallet.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/ImplementsProxyWallet.kt new file mode 100644 index 0000000..d9e0e8c --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/ImplementsProxyWallet.kt @@ -0,0 +1,15 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.proxy.after + +class ImplementsProxyWallet( + private val realWallet: RealWallet +) : Wallet { + override fun deposit(amount: Int) { + println("지갑에 $amount 원이 입금되었습니다.") + realWallet.deposit(amount) + } + + override fun withdrawal(amount: Int) { + println("지갑에서 $amount 원이 출금되었습니다.") + realWallet.withdrawal(amount) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/Owner.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/Owner.kt new file mode 100644 index 0000000..82b88da --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/Owner.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.proxy.after + +class Owner( + private val wallet: Wallet +) { + fun deposit(amount: Int) { + wallet.deposit(amount) + } + + fun withdrawal(amount: Int) { + wallet.withdrawal(amount) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/RealWallet.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/RealWallet.kt new file mode 100644 index 0000000..2d3f403 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/RealWallet.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.proxy.after + +open class RealWallet( + private var balance: Int = 0 +) : Wallet { + override fun deposit(amount: Int) { + this.balance += amount + } + + override fun withdrawal(amount: Int) { + this.balance -= amount + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/Wallet.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/Wallet.kt new file mode 100644 index 0000000..22a7a57 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/Wallet.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.proxy.after + +interface Wallet { + fun deposit(amount: Int) + + fun withdrawal(amount: Int) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/WalletApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/WalletApplication.kt new file mode 100644 index 0000000..64e2499 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/after/WalletApplication.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.proxy.after + +class ProxyWalletApplication + +fun main() { + val wallet = ImplementsProxyWallet(RealWallet()) + val owner = Owner(wallet) + owner.deposit(1000) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/before/Owner.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/before/Owner.kt new file mode 100644 index 0000000..861b7bb --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/before/Owner.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.proxy.before + +class Owner( + private val wallet: Wallet +) { + fun deposit(amount: Int) { + wallet.deposit(amount) + } + + fun withdrawal(amount: Int) { + wallet.withdrawal(amount) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/before/Wallet.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/before/Wallet.kt new file mode 100644 index 0000000..73e2af3 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/before/Wallet.kt @@ -0,0 +1,15 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.proxy.before + +class Wallet( + private var balance: Int = 0 +) { + fun deposit(amount: Int) { + println("지갑에 $amount 원이 입금되었습니다.") + this.balance += amount + } + + fun withdrawal(amount: Int) { + println("지갑에서 $amount 원이 출금되었습니다.") + this.balance -= amount + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/before/WalletApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/before/WalletApplication.kt new file mode 100644 index 0000000..0033986 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/proxy/before/WalletApplication.kt @@ -0,0 +1,9 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.proxy.before + +class WalletApplication + +fun main() { + val wallet = Wallet() + val owner = Owner(wallet) + owner.deposit(1000) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacter.kt new file mode 100644 index 0000000..e76424f --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacter.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.after + +class GameCharacter( + private var state: State = StoppingState() +) { + fun move() { + state.move(this) + } + + fun changeState(newState: State) { + this.state = newState + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacterApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacterApplication.kt new file mode 100644 index 0000000..a117167 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/GameCharacterApplication.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.after + +class GameCharacterApplicationAfter + +fun main() { + val gameCharacter = GameCharacter() + gameCharacter.move() + gameCharacter.move() + gameCharacter.move() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/State.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/State.kt new file mode 100644 index 0000000..161b57f --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/State.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.after + +interface State { + fun move(gameCharacter: GameCharacter) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/States.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/States.kt new file mode 100644 index 0000000..1108b77 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/after/States.kt @@ -0,0 +1,22 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.after + +class StoppingState : State { + override fun move(gameCharacter: GameCharacter) { + println("캐릭터가 이동한다.") + gameCharacter.changeState(MovingState()) + } +} + +class MovingState : State { + override fun move(gameCharacter: GameCharacter) { + println("캐릭터가 점프한다.") + gameCharacter.changeState(JumpingState()) + } +} + +class JumpingState : State { + override fun move(gameCharacter: GameCharacter) { + println("캐릭터가 착지한 뒤 정지한다.") + gameCharacter.changeState(StoppingState()) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacter.kt new file mode 100644 index 0000000..d3a2370 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacter.kt @@ -0,0 +1,22 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.before + +class GameCharacter( + private var state: State = State.STOPPING +) { + fun move() { + when (state) { + State.STOPPING -> { + println("캐릭터가 이동한다.") + this.state = State.MOVING + } + State.MOVING -> { + println("캐릭터가 점프한다.") + this.state = State.JUMPING + } + State.JUMPING -> { + println("캐릭터가 착지한 뒤 정지한다.") + this.state = State.STOPPING + } + } + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacterApplication.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacterApplication.kt new file mode 100644 index 0000000..629df44 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/GameCharacterApplication.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.before + +class GameCharacterApplicationBefore + +fun main() { + val gameCharacter = GameCharacter() + gameCharacter.move() + gameCharacter.move() + gameCharacter.move() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/State.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/State.kt new file mode 100644 index 0000000..9eb021c --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/state/before/State.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.state.before + +enum class State { + STOPPING, + MOVING, + JUMPING, +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/after/AgeTypeAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/after/AgeTypeAfter.kt new file mode 100644 index 0000000..dd707c7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/after/AgeTypeAfter.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.strategy.after + +enum class AgeTypeAfter(val discountPolicy: DiscountPolicy) { + KIDS(DiscountPolicy { price -> price * 70 / 100 }), + ADULTS(DiscountPolicy { price -> price * 90 / 100 }), +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/after/PriceCalculatorAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/after/PriceCalculatorAfter.kt new file mode 100644 index 0000000..665156c --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/after/PriceCalculatorAfter.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.strategy.after + +class PriceCalculatorAfter { + fun calculate(price: Int, discountPolicy: DiscountPolicy): Int { + return discountPolicy.calculate(price) + } +} + +fun interface DiscountPolicy { + fun calculate(price: Int): Int +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/after/PriceCalculatorApplicationAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/after/PriceCalculatorApplicationAfter.kt new file mode 100644 index 0000000..5de0bc1 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/after/PriceCalculatorApplicationAfter.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.strategy.after + +class PriceCalculatorApplicationAfter + +fun main() { + val priceCalculator = PriceCalculatorAfter() + val price = 10000 + val ageType = AgeTypeAfter.KIDS + val calculatedPrice = priceCalculator.calculate(price, ageType.discountPolicy) + println(calculatedPrice) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/before/AgeTypeBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/before/AgeTypeBefore.kt new file mode 100644 index 0000000..8e52a9d --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/before/AgeTypeBefore.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.strategy.before + +enum class AgeTypeBefore { + KIDS, + ADULTS, +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/before/PriceCalculatorApplicationBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/before/PriceCalculatorApplicationBefore.kt new file mode 100644 index 0000000..d3dcc1f --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/before/PriceCalculatorApplicationBefore.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.strategy.before + +class PriceCalculatorApplicationBefore + +fun main() { + val priceCalculator = PriceCalculatorBefore() + val price = 10000 + val ageTypeBefore = AgeTypeBefore.ADULTS + val calculatedPrice = priceCalculator.calculate(price, ageTypeBefore) + println(calculatedPrice) +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/before/PriceCalculatorBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/before/PriceCalculatorBefore.kt new file mode 100644 index 0000000..b0764b8 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/strategy/before/PriceCalculatorBefore.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.strategy.before + +class PriceCalculatorBefore { + fun calculate(price: Int, ageType: AgeTypeBefore): Int { + return when (ageType) { + AgeTypeBefore.KIDS -> price * 70 / 100 + AgeTypeBefore.ADULTS -> price * 85 / 100 + } + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SoccerInstructorAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SoccerInstructorAfter.kt new file mode 100644 index 0000000..bb9a227 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SoccerInstructorAfter.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.templatemethod.after + +class SoccerInstructorAfter : SportsInstructor() { + override fun showMovements() { + println("축구 동작을 보여준다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SportsInstructor.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SportsInstructor.kt new file mode 100644 index 0000000..6dd7a51 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SportsInstructor.kt @@ -0,0 +1,19 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.templatemethod.after + +abstract class SportsInstructor { + fun startLesson() { + showStretching() + showMovements() + greeting() + } + + private fun showStretching() { + println("스트레칭을 한다.") + } + + protected abstract fun showMovements() + + private fun greeting() { + println("인사를 한다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SportsInstructorApplicationAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SportsInstructorApplicationAfter.kt new file mode 100644 index 0000000..1bb752c --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SportsInstructorApplicationAfter.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.templatemethod.after + +class SportsInstructorApplicationAfter + +fun main() { + val swimmingInstructor = SwimmingInstructorAfter() + swimmingInstructor.startLesson() + val soccerInstructor = SoccerInstructorAfter() + soccerInstructor.startLesson() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SwimmingInstructorAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SwimmingInstructorAfter.kt new file mode 100644 index 0000000..cd2fe6b --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/after/SwimmingInstructorAfter.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.templatemethod.after + +class SwimmingInstructorAfter : SportsInstructor() { + override fun showMovements() { + println("수영 동작을 보여준다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/before/SoccerInstructorBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/before/SoccerInstructorBefore.kt new file mode 100644 index 0000000..08e46cf --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/before/SoccerInstructorBefore.kt @@ -0,0 +1,21 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.templatemethod.before + +class SoccerInstructorBefore { + fun startLesson() { + showStretching() + showSoccerMovements() + greeting() + } + + private fun showStretching() { + println("스트레칭을 한다.") + } + + private fun showSoccerMovements() { + println("축구 동작을 보여준다.") + } + + private fun greeting() { + println("인사를 한다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/before/SportsInstructorApplicationBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/before/SportsInstructorApplicationBefore.kt new file mode 100644 index 0000000..fa20039 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/before/SportsInstructorApplicationBefore.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.templatemethod.before + +class SportsInstructorApplicationBefore + +fun main() { + val swimmingTeacher = SwimmingInstructorBefore() + swimmingTeacher.startLesson() + val soccerTeacher = SoccerInstructorBefore() + soccerTeacher.startLesson() +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/before/SwimmingInstructorBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/before/SwimmingInstructorBefore.kt new file mode 100644 index 0000000..00ca81d --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/designpattern/templatemethod/before/SwimmingInstructorBefore.kt @@ -0,0 +1,21 @@ +package com.banjjoknim.soliddesignpatternsample.designpattern.templatemethod.before + +class SwimmingInstructorBefore { + fun startLesson() { + showStretching() + showSwimming() + greeting() + } + + private fun showStretching() { + println("스트레칭을 한다.") + } + + private fun showSwimming() { + println("수영 동작을 보여준다.") + } + + private fun greeting() { + println("인사를 한다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/AmazonStorageService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/AmazonStorageService.kt new file mode 100644 index 0000000..21ea736 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/AmazonStorageService.kt @@ -0,0 +1,19 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.after + +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.AmazonStorage +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.AmazonStorageReadFileRequest +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.ReadFileRequest +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.StorageFile +import org.springframework.stereotype.Service + +@Service +class AmazonStorageService : StorageService { + override fun readStorageFile(request: ReadFileRequest): StorageFile { + val storage = AmazonStorage() + val amazonStorageReadFileRequest = object : AmazonStorageReadFileRequest { + override val fileName: String + get() = request.fileInformation + } + return storage.provideStorageFile(amazonStorageReadFileRequest) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/GoogleStorageService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/GoogleStorageService.kt new file mode 100644 index 0000000..a209b54 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/GoogleStorageService.kt @@ -0,0 +1,19 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.after + +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.GoogleStorage +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.GoogleStorageReadFileRequest +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.ReadFileRequest +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.StorageFile +import org.springframework.stereotype.Component + +@Component +class GoogleStorageService : StorageService { + override fun readStorageFile(request: ReadFileRequest): StorageFile { + val storage = GoogleStorage() + val googleStorageReadFileRequest = object : GoogleStorageReadFileRequest { + override val fileNumber: Int + get() = request.fileInformation.toInt() + } + return storage.provideStorageFile(googleStorageReadFileRequest) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageControllerAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageControllerAfter.kt new file mode 100644 index 0000000..bb5b822 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageControllerAfter.kt @@ -0,0 +1,18 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.after + +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.ReadFileRequest +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.StorageFile +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/storages") +@RestController +class StorageControllerAfter( + private val storageService: StorageService +) { + @GetMapping("/with-dip") + fun readStorageFile(request: ReadFileRequest): StorageFile { + return storageService.readStorageFile(request) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageService.kt new file mode 100644 index 0000000..768ffb0 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageService.kt @@ -0,0 +1,8 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.after + +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.ReadFileRequest +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.StorageFile + +interface StorageService { + fun readStorageFile(request: ReadFileRequest): StorageFile +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageServiceConfiguration.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageServiceConfiguration.kt new file mode 100644 index 0000000..3acf3e7 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/after/StorageServiceConfiguration.kt @@ -0,0 +1,24 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.after + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +class StorageServiceConfiguration { + + /** + * AmazonStorageService 를 적용하고 싶은 경우 + */ + @Bean + fun storageService(): StorageService { + return AmazonStorageService() + } + + /** + * GoogleStorageService 를 적용하고 싶은 경우 + */ +// @Bean +// fun storageService(): StorageService { +// return GoogleStorageService() +// } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageControllerBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageControllerBefore.kt new file mode 100644 index 0000000..19c615a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageControllerBefore.kt @@ -0,0 +1,26 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.before + +import com.banjjoknim.soliddesignpatternsample.solid.dip.after.AmazonStorageService +import com.banjjoknim.soliddesignpatternsample.solid.dip.after.GoogleStorageService +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.ReadFileRequest +import com.banjjoknim.soliddesignpatternsample.solid.dip.common.StorageFile +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/storages") +@RestController +class StorageControllerBefore( + private val amazonStorageService: AmazonStorageService, + private val googleStorageService: GoogleStorageService, +) { + @GetMapping("/none-dip") + fun readStorageFile(@RequestParam storageType: StorageType, @RequestParam fileInformation: String): StorageFile { + val readFileRequest = ReadFileRequest(fileInformation) + return when (storageType) { + StorageType.AMAZON -> amazonStorageService.readStorageFile(readFileRequest) + StorageType.GOOGLE -> googleStorageService.readStorageFile(readFileRequest) + } + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageType.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageType.kt new file mode 100644 index 0000000..0b2164e --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/before/StorageType.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.before + +enum class StorageType { + AMAZON, + GOOGLE +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorage.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorage.kt new file mode 100644 index 0000000..53ad2b2 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorage.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.common + +class AmazonStorage { + fun provideStorageFile(request: AmazonStorageReadFileRequest): StorageFile { + return StorageFile("${request.fileName} data from amazon") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorageReadFileRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorageReadFileRequest.kt new file mode 100644 index 0000000..75f0614 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/AmazonStorageReadFileRequest.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.common + +interface AmazonStorageReadFileRequest { + val fileName: String +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorage.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorage.kt new file mode 100644 index 0000000..f62af11 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorage.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.common + +class GoogleStorage { + fun provideStorageFile(request: GoogleStorageReadFileRequest): StorageFile { + return StorageFile("${request.fileNumber} data from amazon") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorageReadFileRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorageReadFileRequest.kt new file mode 100644 index 0000000..a793716 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/GoogleStorageReadFileRequest.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.common + +interface GoogleStorageReadFileRequest { + val fileNumber: Int +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/ReadFileRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/ReadFileRequest.kt new file mode 100644 index 0000000..ce48ecb --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/ReadFileRequest.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.common + +data class ReadFileRequest( + val fileInformation: String +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/StorageFile.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/StorageFile.kt new file mode 100644 index 0000000..1890897 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/dip/common/StorageFile.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.dip.common + +data class StorageFile( + val data: String +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/CinemaControllerAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/CinemaControllerAfter.kt new file mode 100644 index 0000000..4998ee9 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/CinemaControllerAfter.kt @@ -0,0 +1,25 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.after + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/cinemas") +@RestController +class CinemaControllerAfter( + private val seatStatusService: SeatStatusServiceAfter, + private val reservationService: ReservationServiceAfter +) { + @GetMapping("/with-isp-get-seat-status") + fun getSeatStatus(): SeatStatus { + return seatStatusService.getSeatStatus() + } + + @PostMapping("/with-isp-make-reservation") + fun makeReservation(): Reservation { + return reservationService.makeReservation() + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationService.kt new file mode 100644 index 0000000..85b60ef --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationService.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.after + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation + +interface ReservationService { + fun makeReservation(): Reservation +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationServiceAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationServiceAfter.kt new file mode 100644 index 0000000..c30265c --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/ReservationServiceAfter.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.after + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import org.springframework.stereotype.Service + +@Service +class ReservationServiceAfter : ReservationService { + override fun makeReservation(): Reservation { + return Reservation(seat = "A1", id = 1L) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusService.kt new file mode 100644 index 0000000..dc53340 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusService.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.after + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus + +interface SeatStatusService { + fun getSeatStatus(): SeatStatus +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusServiceAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusServiceAfter.kt new file mode 100644 index 0000000..3a97a82 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/after/SeatStatusServiceAfter.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.after + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatusType +import org.springframework.stereotype.Service + +@Service +class SeatStatusServiceAfter : SeatStatusService { + override fun getSeatStatus(): SeatStatus { + return SeatStatus(SeatStatusType.CAN_RESERVATION) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaControllerBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaControllerBefore.kt new file mode 100644 index 0000000..40791ca --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaControllerBefore.kt @@ -0,0 +1,25 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.before + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/cinemas") +@RestController +class CinemaControllerBefore( + private val seatStatusService: SeatStatusServiceBefore, + private val reservationService: ReservationServiceBefore, +) { + @GetMapping("/none-isp-get-seat-status") + fun getSeatStatus(): SeatStatus { + return seatStatusService.getSeatStatus() + } + + @PostMapping("/none-isp-make-reservation") + fun makeReservation(): Reservation { + return reservationService.makeReservation() + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaService.kt new file mode 100644 index 0000000..538a7aa --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/CinemaService.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.before + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus + +interface CinemaService { + fun makeReservation(): Reservation + + fun getSeatStatus(): SeatStatus +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/ReservationServiceBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/ReservationServiceBefore.kt new file mode 100644 index 0000000..5680588 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/ReservationServiceBefore.kt @@ -0,0 +1,16 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.before + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus +import org.springframework.stereotype.Service + +@Service +class ReservationServiceBefore : CinemaService { + override fun makeReservation(): Reservation { + return Reservation(seat = "A1", id = 1L) + } + + override fun getSeatStatus(): SeatStatus { + throw UnsupportedOperationException("좌석 현황 조회는 지원하지 않습니다.") // 불필요함에도 불구하고 구현해주어야 한다. + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/SeatStatusServiceBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/SeatStatusServiceBefore.kt new file mode 100644 index 0000000..db6a95e --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/before/SeatStatusServiceBefore.kt @@ -0,0 +1,17 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.before + +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.Reservation +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatus +import com.banjjoknim.soliddesignpatternsample.solid.isp.common.SeatStatusType +import org.springframework.stereotype.Service + +@Service +class SeatStatusServiceBefore : CinemaService { + override fun makeReservation(): Reservation { + throw UnsupportedOperationException("영화표 예매는 지원하지 않습니다.") // 불필요함에도 불구하고 구현해주어야 한다. + } + + override fun getSeatStatus(): SeatStatus { + return SeatStatus(SeatStatusType.CAN_RESERVATION) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/Reservation.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/Reservation.kt new file mode 100644 index 0000000..c3cdfad --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/Reservation.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.common + +import javax.persistence.Entity +import javax.persistence.Id + +@Entity +class Reservation( + val seat: String, + @Id + val id: Long = 0L +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatus.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatus.kt new file mode 100644 index 0000000..6b4e700 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatus.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.common + +data class SeatStatus( + val type: SeatStatusType +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatusType.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatusType.kt new file mode 100644 index 0000000..182c281 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/isp/common/SeatStatusType.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.solid.isp.common + +enum class SeatStatusType { + CAN_RESERVATION, + CANNOT_RESERVATION +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/CarVehicleServiceAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/CarVehicleServiceAfter.kt new file mode 100644 index 0000000..6ddb4df --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/CarVehicleServiceAfter.kt @@ -0,0 +1,24 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.after + +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.Vehicle +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleMoveRequest +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleRepository +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleType +import org.springframework.stereotype.Service + +@Service +class CarVehicleServiceAfter( + private val vehicleRepository: VehicleRepository +): VehicleServiceAfter() { + override fun move(request: VehicleMoveRequest): Vehicle { + println("자동차가 이동합니다.") + val vehicle = vehicleRepository.getVehicle(request.vehicleId) + vehicle.positionX = request.positionX + vehicle.positionY = request.positionY + return vehicle + } + + override fun vehicleType(): VehicleType { + return VehicleType.CAR + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/PlaneVehicleServiceAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/PlaneVehicleServiceAfter.kt new file mode 100644 index 0000000..7e698fd --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/PlaneVehicleServiceAfter.kt @@ -0,0 +1,24 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.after + +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.Vehicle +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleMoveRequest +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleRepository +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleType +import org.springframework.stereotype.Service + +@Service +class PlaneVehicleServiceAfter( + private val vehicleRepository: VehicleRepository +): VehicleServiceAfter() { + override fun move(request: VehicleMoveRequest): Vehicle { + println("비행기가 이동합니다.") + val vehicle = vehicleRepository.getVehicle(request.vehicleId) + vehicle.positionX = request.positionX + vehicle.positionY = request.positionY + return vehicle + } + + override fun vehicleType(): VehicleType { + return VehicleType.PLANE + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/VehicleControllerAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/VehicleControllerAfter.kt new file mode 100644 index 0000000..e98146b --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/VehicleControllerAfter.kt @@ -0,0 +1,20 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.after + +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.Vehicle +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleMoveRequest +import org.springframework.web.bind.annotation.PatchMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/vehicles") +@RestController +class VehicleControllerAfter( + private val vehicleServiceFactoryAfter: VehicleServiceFactoryAfter +) { + @PatchMapping("/with-lsp") + fun move(@RequestBody request: VehicleMoveRequest): Vehicle { + val vehicleServiceAfter = vehicleServiceFactoryAfter.getVehicleServiceAfter(request.vehicleType) + return vehicleServiceAfter.move(request) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/VehicleServiceAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/VehicleServiceAfter.kt new file mode 100644 index 0000000..e3c4884 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/VehicleServiceAfter.kt @@ -0,0 +1,11 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.after + +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.Vehicle +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleMoveRequest +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleType + +abstract class VehicleServiceAfter { + abstract fun move(request: VehicleMoveRequest): Vehicle + + abstract fun vehicleType(): VehicleType +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/VehicleServiceFactoryAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/VehicleServiceFactoryAfter.kt new file mode 100644 index 0000000..4c0f3fb --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/after/VehicleServiceFactoryAfter.kt @@ -0,0 +1,14 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.after + +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleType +import org.springframework.stereotype.Component + +@Component +class VehicleServiceFactoryAfter( + val vehicleServiceAfters: List +) { + fun getVehicleServiceAfter(vehicleType: VehicleType): VehicleServiceAfter { + return vehicleServiceAfters.find { it.vehicleType() == vehicleType } + ?: throw NoSuchElementException("해당 이동수단에 대한 구현이 존재하지 않습니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/CarVehicleServiceBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/CarVehicleServiceBefore.kt new file mode 100644 index 0000000..1711e64 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/CarVehicleServiceBefore.kt @@ -0,0 +1,23 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.before + +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.Vehicle +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleMoveRequest +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleRepository +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleType +import org.springframework.stereotype.Service + +@Service +class CarVehicleServiceBefore( + private val vehicleRepository: VehicleRepository +) : VehicleServiceBefore(vehicleRepository) { + override fun move(request: VehicleMoveRequest): Vehicle { + val vehicle = vehicleRepository.getVehicle(request.vehicleId) + vehicle.positionX += request.positionX // 하위 타입에서의 잘못된 오버라이딩! + vehicle.positionY += request.positionY // 하위 타입에서의 잘못된 오버라이딩! + return vehicle + } + + override fun vehicleType(): VehicleType { + return VehicleType.CAR + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/PlaneVehicleServiceBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/PlaneVehicleServiceBefore.kt new file mode 100644 index 0000000..bcdf024 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/PlaneVehicleServiceBefore.kt @@ -0,0 +1,23 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.before + +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.Vehicle +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleMoveRequest +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleRepository +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleType +import org.springframework.stereotype.Service + +@Service +class PlaneVehicleServiceBefore( + private val vehicleRepository: VehicleRepository +) : VehicleServiceBefore(vehicleRepository) { + override fun move(request: VehicleMoveRequest): Vehicle { + val vehicle = vehicleRepository.getVehicle(request.vehicleId) + vehicle.positionX -= request.positionX // 하위 타입에서의 잘못된 오버라이딩! + vehicle.positionY -= request.positionY // 하위 타입에서의 잘못된 오버라이딩! + return vehicle + } + + override fun vehicleType(): VehicleType { + return VehicleType.PLANE + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/VehicleControllerBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/VehicleControllerBefore.kt new file mode 100644 index 0000000..61edd7b --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/VehicleControllerBefore.kt @@ -0,0 +1,20 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.before + +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.Vehicle +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleMoveRequest +import org.springframework.web.bind.annotation.PatchMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/vehicles") +@RestController +class VehicleControllerBefore( + private val vehicleServiceFactoryBefore: VehicleServiceFactoryBefore +) { + @PatchMapping("/none-lsp") + fun move(@RequestBody request: VehicleMoveRequest): Vehicle { + val vehicleServiceBefore = vehicleServiceFactoryBefore.getVehicleServiceBefore(request.vehicleType) + return vehicleServiceBefore.move(request) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/VehicleServiceBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/VehicleServiceBefore.kt new file mode 100644 index 0000000..8f9996c --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/VehicleServiceBefore.kt @@ -0,0 +1,19 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.before + +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.Vehicle +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleMoveRequest +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleRepository +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleType + +abstract class VehicleServiceBefore( + private val vehicleRepository: VehicleRepository +) { + open fun move(request: VehicleMoveRequest): Vehicle { + val vehicle = vehicleRepository.getVehicle(request.vehicleId) + vehicle.positionX = request.positionX + vehicle.positionY = request.positionY + return vehicle + } + + abstract fun vehicleType(): VehicleType +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/VehicleServiceFactoryBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/VehicleServiceFactoryBefore.kt new file mode 100644 index 0000000..eaf8bde --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/before/VehicleServiceFactoryBefore.kt @@ -0,0 +1,14 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.before + +import com.banjjoknim.soliddesignpatternsample.solid.lsp.common.VehicleType +import org.springframework.stereotype.Component + +@Component +class VehicleServiceFactoryBefore( + val vehicleServiceBefores: List +) { + fun getVehicleServiceBefore(vehicleType: VehicleType): VehicleServiceBefore { + return vehicleServiceBefores.find { it.vehicleType() == vehicleType } + ?: throw NoSuchElementException("해당 이동수단에 대한 구현이 존재하지 않습니다.") + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/Vehicle.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/Vehicle.kt new file mode 100644 index 0000000..4690a09 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/Vehicle.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.common + +import javax.persistence.Entity +import javax.persistence.Id + +@Entity +class Vehicle( + var positionX: Int = 0, + var positionY: Int = 0, + @Id + val id: Long = 0L +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleMoveRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleMoveRequest.kt new file mode 100644 index 0000000..227035d --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleMoveRequest.kt @@ -0,0 +1,8 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.common + +data class VehicleMoveRequest( + val vehicleId: Long, + val positionX: Int, + val positionY: Int, + val vehicleType: VehicleType +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleRepository.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleRepository.kt new file mode 100644 index 0000000..19a822d --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleRepository.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.common + +interface VehicleRepository { + fun getVehicle(vehicleId: Long): Vehicle +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleRepositoryStub.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleRepositoryStub.kt new file mode 100644 index 0000000..63ae256 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleRepositoryStub.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.common + +import org.springframework.stereotype.Repository + +@Repository +class VehicleRepositoryStub : VehicleRepository { + override fun getVehicle(vehicleId: Long): Vehicle { + return Vehicle(id = vehicleId) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleType.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleType.kt new file mode 100644 index 0000000..b8e2bb0 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/lsp/common/VehicleType.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.solid.lsp.common + +enum class VehicleType { + CAR, + PLANE +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/CardPaymentService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/CardPaymentService.kt new file mode 100644 index 0000000..e577e5f --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/CardPaymentService.kt @@ -0,0 +1,20 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.after + +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.Payment +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentRepository +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentType +import org.springframework.stereotype.Repository + +@Repository +class CardPaymentService( + private val paymentRepository: PaymentRepository +): PaymentServiceAfter { + override fun pay(request: PaymentRequestAfter): Payment { + println("카드 결제로 ${request.amount}원을 차감합니다.") + return paymentRepository.createPayment(request.amount, request.paymentType) + } + + override fun getPaymentType(): PaymentType { + return PaymentType.CARD + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/CashPaymentService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/CashPaymentService.kt new file mode 100644 index 0000000..effc56b --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/CashPaymentService.kt @@ -0,0 +1,20 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.after + +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.Payment +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentRepository +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentType +import org.springframework.stereotype.Repository + +@Repository +class CashPaymentService( + private val paymentRepository: PaymentRepository +): PaymentServiceAfter { + override fun pay(request: PaymentRequestAfter): Payment { + println("현금드 결제로 ${request.amount}원을 차감합니다.") + return paymentRepository.createPayment(request.amount, request.paymentType) + } + + override fun getPaymentType(): PaymentType { + return PaymentType.CASH + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/CouponPaymentService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/CouponPaymentService.kt new file mode 100644 index 0000000..b4c8cc3 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/CouponPaymentService.kt @@ -0,0 +1,20 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.after + +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.Payment +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentRepository +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentType +import org.springframework.stereotype.Repository + +@Repository +class CouponPaymentService( + private val paymentRepository: PaymentRepository +): PaymentServiceAfter { + override fun pay(request: PaymentRequestAfter): Payment { + println("쿠폰 결제는 잔고 차감이 없습니다.") + return paymentRepository.createPayment(request.amount, request.paymentType) + } + + override fun getPaymentType(): PaymentType { + return PaymentType.COUPON + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentController.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentController.kt new file mode 100644 index 0000000..0b58d51 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentController.kt @@ -0,0 +1,18 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.after + +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.Payment +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/payments") +@RestController +class PaymentController( + private val paymentServiceFactory: PaymentServiceFactory +) { + @PostMapping("with-ocp") + fun pay(request: PaymentRequestAfter): Payment { + val paymentService = paymentServiceFactory.getPaymentService(request.paymentType) + return paymentService.pay(request) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentRequestAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentRequestAfter.kt new file mode 100644 index 0000000..2dd7a27 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentRequestAfter.kt @@ -0,0 +1,8 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.after + +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentType + +data class PaymentRequestAfter( + val amount: Int, + val paymentType: PaymentType +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentServiceAfter.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentServiceAfter.kt new file mode 100644 index 0000000..a5e8956 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentServiceAfter.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.after + +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.Payment +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentType + +interface PaymentServiceAfter { + fun pay(request: PaymentRequestAfter): Payment + + fun getPaymentType(): PaymentType +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentServiceFactory.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentServiceFactory.kt new file mode 100644 index 0000000..152fcf2 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/after/PaymentServiceFactory.kt @@ -0,0 +1,27 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.after + +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentType +import org.springframework.stereotype.Component + +@Component +class PaymentServiceFactory(val paymentServices: List) { + fun getPaymentService(paymentType: PaymentType): PaymentServiceAfter { + return this.paymentServices.find { it.getPaymentType() == paymentType } + ?: throw NoSuchElementException("해당 결제방식에 대한 구현이 존재하지 않습니다.") + } +} + +//@Component +//class PaymentServiceFactory( +// private val cashPaymentService: CashPaymentService, +// private val cardPaymentService: CardPaymentService, +// private val couponPaymentService: CouponPaymentService +//) { +// fun findPaymentService(paymentType: PaymentType): PaymentServiceAfter { +// return when (paymentType) { +// PaymentType.CASH -> cashPaymentService +// PaymentType.CARD -> cardPaymentService +// PaymentType.COUPON -> couponPaymentService +// } +// } +//} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/before/PaymentControllerBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/before/PaymentControllerBefore.kt new file mode 100644 index 0000000..0bd196a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/before/PaymentControllerBefore.kt @@ -0,0 +1,18 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.before + +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.Payment +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/payments") +@RestController +class PaymentControllerBefore( + private val paymentServiceBefore: PaymentServiceBefore +) { + @PostMapping("/none-ocp") + fun pay(@RequestBody request: PaymentRequestBefore): Payment { + return paymentServiceBefore.pay(request) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/before/PaymentRequestBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/before/PaymentRequestBefore.kt new file mode 100644 index 0000000..b62464a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/before/PaymentRequestBefore.kt @@ -0,0 +1,8 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.before + +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentType + +data class PaymentRequestBefore( + val amount: Int, + val type: PaymentType +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/before/PaymentServiceBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/before/PaymentServiceBefore.kt new file mode 100644 index 0000000..3472f93 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/before/PaymentServiceBefore.kt @@ -0,0 +1,21 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.before + +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.Payment +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentRepository +import com.banjjoknim.soliddesignpatternsample.solid.ocp.common.PaymentType +import org.springframework.stereotype.Service + +@Service +class PaymentServiceBefore( + private val paymentRepository: PaymentRepository +) { + fun pay(request: PaymentRequestBefore): Payment { + when (request.type) { + PaymentType.CASH -> println("현금 결제로 ${request.amount}원을 차감합니다.") + PaymentType.CARD -> println("카드 결제로 ${request.amount}원을 차감합니다.") + PaymentType.COUPON -> println("쿠폰 결제는 잔고 차감이 없습니다.") + // NewPaymentType -> ... + } + return paymentRepository.createPayment(request.amount, request.type) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/Payment.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/Payment.kt new file mode 100644 index 0000000..09451bb --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/Payment.kt @@ -0,0 +1,12 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.common + +import javax.persistence.Entity +import javax.persistence.Id + +@Entity +class Payment( + val amount: Int, + val type: PaymentType, + @Id + val id: Long = 0L +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/PaymentRepository.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/PaymentRepository.kt new file mode 100644 index 0000000..b6fa1f9 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/PaymentRepository.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.common + +interface PaymentRepository { + fun createPayment(amount: Int, paymentType: PaymentType): Payment +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/PaymentRepositoryStub.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/PaymentRepositoryStub.kt new file mode 100644 index 0000000..495f124 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/PaymentRepositoryStub.kt @@ -0,0 +1,10 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.common + +import org.springframework.stereotype.Repository + +@Repository +class PaymentRepositoryStub : PaymentRepository { + override fun createPayment(amount: Int, paymentType: PaymentType): Payment { + return Payment(amount = amount, type = paymentType) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/PaymentType.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/PaymentType.kt new file mode 100644 index 0000000..59bdf10 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/ocp/common/PaymentType.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.solid.ocp.common + +enum class PaymentType { + CASH, + CARD, + COUPON +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/CreateAccountController.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/CreateAccountController.kt new file mode 100644 index 0000000..f20011e --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/CreateAccountController.kt @@ -0,0 +1,18 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.after + +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.Account +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/accounts") +@RestController +class CreateAccountController( + private val createAccountService: CreateAccountService +) { + @PostMapping("") + fun createAccount(@RequestBody request: CreateAccountRequest): Account { + return createAccountService.createAccount(request) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/CreateAccountRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/CreateAccountRequest.kt new file mode 100644 index 0000000..1ba5648 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/CreateAccountRequest.kt @@ -0,0 +1,5 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.after + +data class CreateAccountRequest( + val holderName: String +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/CreateAccountService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/CreateAccountService.kt new file mode 100644 index 0000000..3347817 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/CreateAccountService.kt @@ -0,0 +1,14 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.after + +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.Account +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.AccountRepository +import org.springframework.stereotype.Service + +@Service +class CreateAccountService( + private val accountRepository: AccountRepository +) { + fun createAccount(request: CreateAccountRequest): Account { + return accountRepository.createAccount(request.holderName) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/DepositAccountController.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/DepositAccountController.kt new file mode 100644 index 0000000..d9ec50a --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/DepositAccountController.kt @@ -0,0 +1,18 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.after + +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.Account +import org.springframework.web.bind.annotation.PatchMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/accounts") +@RestController +class DepositAccountController( + private val depositAccountService: DepositAccountService +) { + @PatchMapping("/deposit") + fun depositAccount(@RequestBody request: DepositAccountRequest): Account { + return depositAccountService.depositAccount(request) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/DepositAccountRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/DepositAccountRequest.kt new file mode 100644 index 0000000..cbe5060 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/DepositAccountRequest.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.after + +data class DepositAccountRequest( + val accountId: Long, + val amount: Int +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/DepositAccountService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/DepositAccountService.kt new file mode 100644 index 0000000..0516286 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/DepositAccountService.kt @@ -0,0 +1,16 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.after + +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.Account +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.AccountRepository +import org.springframework.stereotype.Service + +@Service +class DepositAccountService( + private val accountRepository: AccountRepository +) { + fun depositAccount(request: DepositAccountRequest): Account { + val account = accountRepository.findAccount(request.accountId) + account.deposit(request.amount) + return account + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/WithdrawalAccountController.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/WithdrawalAccountController.kt new file mode 100644 index 0000000..f65b2d5 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/WithdrawalAccountController.kt @@ -0,0 +1,18 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.after + +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.Account +import org.springframework.web.bind.annotation.PatchMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/accounts") +@RestController +class WithdrawalAccountController( + private val withdrawalAccountService: WithdrawalAccountService +) { + @PatchMapping("/withdrawal") + fun withdrawal(@RequestBody request: WithdrawalAccountRequest): Account { + return withdrawalAccountService.withdrawalAccount(request) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/WithdrawalAccountRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/WithdrawalAccountRequest.kt new file mode 100644 index 0000000..d4aa847 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/WithdrawalAccountRequest.kt @@ -0,0 +1,6 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.after + +data class WithdrawalAccountRequest( + val accountId: Long, + val amount: Int +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/WithdrawalAccountService.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/WithdrawalAccountService.kt new file mode 100644 index 0000000..09f106e --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/after/WithdrawalAccountService.kt @@ -0,0 +1,16 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.after + +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.Account +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.AccountRepository +import org.springframework.stereotype.Service + +@Service +class WithdrawalAccountService( + private val accountRepository: AccountRepository +) { + fun withdrawalAccount(request: WithdrawalAccountRequest): Account { + val account = accountRepository.findAccount(request.accountId) + account.withdrawal(request.amount) + return account + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/AccountControllerBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/AccountControllerBefore.kt new file mode 100644 index 0000000..563d6db --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/AccountControllerBefore.kt @@ -0,0 +1,18 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.before + +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.Account +import org.springframework.web.bind.annotation.PatchMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RequestMapping("/accounts") +@RestController +class AccountControllerBefore( + private val accountServiceBefore: AccountServiceBefore +) { + @PatchMapping("/manage-account-before") + fun manageAccount(@RequestBody request: ManageAccountRequest): Account { + return accountServiceBefore.manageAccount(request) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/AccountServiceBefore.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/AccountServiceBefore.kt new file mode 100644 index 0000000..a314e83 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/AccountServiceBefore.kt @@ -0,0 +1,28 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.before + +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.Account +import com.banjjoknim.soliddesignpatternsample.solid.srp.common.AccountRepository +import org.springframework.stereotype.Service + +@Service +class AccountServiceBefore( + private val accountRepository: AccountRepository +) { + fun manageAccount(request: ManageAccountRequest): Account { + return when (request.type) { + ManageAccountType.CREATE -> { + accountRepository.createAccount(request.holderName) + } + ManageAccountType.DEPOSIT -> { + val account = accountRepository.findAccount(request.accountId) + account.deposit(request.amount) + account + } + ManageAccountType.WITHDRAWAL -> { + val account = accountRepository.findAccount(request.accountId) + account.withdrawal(request.amount) + account + } + } + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/ManageAccountRequest.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/ManageAccountRequest.kt new file mode 100644 index 0000000..1df3022 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/ManageAccountRequest.kt @@ -0,0 +1,8 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.before + +data class ManageAccountRequest( + val accountId: Long, + val holderName: String, + val amount: Int, + val type: ManageAccountType +) diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/ManageAccountType.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/ManageAccountType.kt new file mode 100644 index 0000000..f96e605 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/before/ManageAccountType.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.before + +enum class ManageAccountType { + CREATE, // 생성 + DEPOSIT, // 입금 + WITHDRAWAL // 출금 +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/common/Account.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/common/Account.kt new file mode 100644 index 0000000..d650ecd --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/common/Account.kt @@ -0,0 +1,20 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.common + +import javax.persistence.Entity +import javax.persistence.Id + +@Entity +class Account( + val holderName: String = "", + var balance: Int = 0, + @Id + val id: Long = 0, +) { + fun deposit(amount: Int) { + this.balance = this.balance + amount + } + + fun withdrawal(amount: Int) { + this.balance = this.balance - amount + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/common/AccountRepository.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/common/AccountRepository.kt new file mode 100644 index 0000000..aa0e27e --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/common/AccountRepository.kt @@ -0,0 +1,7 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.common + +interface AccountRepository { + fun createAccount(holderName: String): Account + + fun findAccount(accountId: Long): Account +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/common/AccountRepositoryStub.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/common/AccountRepositoryStub.kt new file mode 100644 index 0000000..54dfdb2 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/kotlin/com/banjjoknim/soliddesignpatternsample/solid/srp/common/AccountRepositoryStub.kt @@ -0,0 +1,14 @@ +package com.banjjoknim.soliddesignpatternsample.solid.srp.common + +import org.springframework.stereotype.Repository + +@Repository +class AccountRepositoryStub : AccountRepository { + override fun createAccount(holderName: String): Account { + return Account(holderName = "banjjoknim", balance = 0) + } + + override fun findAccount(accountId: Long): Account { + return Account(id = 1L, balance = 10000) + } +} diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/resources/application.properties b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/test/kotlin/com/banjjoknim/soliddesignpatternsample/SolidDesignPatternSampleApplicationTests.kt b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/test/kotlin/com/banjjoknim/soliddesignpatternsample/SolidDesignPatternSampleApplicationTests.kt new file mode 100644 index 0000000..3937125 --- /dev/null +++ b/놀이터(예제 코드 작성)/solid-design-pattern-sample/src/test/kotlin/com/banjjoknim/soliddesignpatternsample/SolidDesignPatternSampleApplicationTests.kt @@ -0,0 +1,13 @@ +package com.banjjoknim.soliddesignpatternsample + +import org.junit.jupiter.api.Test +import org.springframework.boot.test.context.SpringBootTest + +@SpringBootTest +class SolidDesignPatternSampleApplicationTests { + + @Test + fun contextLoads() { + } + +}