diff --git a/inflearn/design-pattern/build.gradle b/inflearn/design-pattern/build.gradle new file mode 100644 index 0000000..3cae2d7 --- /dev/null +++ b/inflearn/design-pattern/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version '1.0-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/inflearn/design-pattern/gradle/wrapper/gradle-wrapper.jar b/inflearn/design-pattern/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..7454180 Binary files /dev/null and b/inflearn/design-pattern/gradle/wrapper/gradle-wrapper.jar differ diff --git a/inflearn/design-pattern/gradle/wrapper/gradle-wrapper.properties b/inflearn/design-pattern/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..69a9715 --- /dev/null +++ b/inflearn/design-pattern/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/inflearn/design-pattern/gradlew b/inflearn/design-pattern/gradlew new file mode 100755 index 0000000..744e882 --- /dev/null +++ b/inflearn/design-pattern/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or 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 UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$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 "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# 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" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/inflearn/design-pattern/gradlew.bat b/inflearn/design-pattern/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/inflearn/design-pattern/gradlew.bat @@ -0,0 +1,89 @@ +@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%" == "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%"=="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! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/inflearn/design-pattern/settings.gradle b/inflearn/design-pattern/settings.gradle new file mode 100644 index 0000000..1a120d6 --- /dev/null +++ b/inflearn/design-pattern/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'design-pattern' + diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/Anchor.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/Anchor.java new file mode 100644 index 0000000..349beae --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/Anchor.java @@ -0,0 +1,4 @@ +package abstract_factorymethod; + +public interface Anchor { +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/Client.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/Client.java new file mode 100644 index 0000000..da875cc --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/Client.java @@ -0,0 +1,20 @@ +package abstract_factorymethod; + +import factorymethod.Ship; +import factorymethod.WhiteShip; + +public class Client extends DefaultShipFactory{ + private ShipPartsFactory shipPartsFactory; + + public Client(ShipPartsFactory shipPartsFactory) { + this.shipPartsFactory = shipPartsFactory; + } + + @Override + Ship createShip() { + WhiteShip ship = new WhiteShip(); + ship.setAnchor(shipPartsFactory.createAnchor()); + ship.setWheel(shipPartsFactory.createWheel()); + return ship; + } +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/DefaultShipFactory.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/DefaultShipFactory.java new file mode 100644 index 0000000..48f8fc8 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/DefaultShipFactory.java @@ -0,0 +1,34 @@ +package abstract_factorymethod; + +import factorymethod.Ship; +import factorymethod.ShipFactory; + +public abstract class DefaultShipFactory { + Ship orderShip(String name, String email) { + validate(name, email); + prepareFor(name); + Ship ship = createShip(); + sendEmailTo(email, ship); + return ship; + } + + abstract Ship createShip(); + private void sendEmailTo(String email, Ship ship) { + System.out.println(ship.getName() + "만들어졌습니다."); + System.out.println(email + "에게 " + ship.getName() + "이 완성됐음을 이메일로 알림을 보냈습니다."); + } + + private void validate(String name, String email) { + if(name == null || name.isBlank()) { + throw new IllegalArgumentException("배 이름을 지어주세요."); + } + + if(email == null || email.isBlank()) { + throw new IllegalArgumentException("연락처를 남겨주세요."); + } + } + + private static void prepareFor(String name) { + System.out.println(name + "만들 준비 중.."); + } +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/ShipInventory.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/ShipInventory.java new file mode 100644 index 0000000..19a9e65 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/ShipInventory.java @@ -0,0 +1,15 @@ +package abstract_factorymethod; + + +import factorymethod.Ship; +import factorymethod.ShipFactory; +import factorymethod.WhiteShipFactory; + +public class ShipInventory { + public static void main(String[] args) { + ShipFactory shipFactory = new WhiteShipFactory(new WhitePartsProFactory()); + Ship ship = shipFactory.createShip(); + System.out.println(ship.getAnchor().getClass()); + System.out.println(ship.getWheel().getClass()); + } +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/ShipPartsFactory.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/ShipPartsFactory.java new file mode 100644 index 0000000..baa9817 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/ShipPartsFactory.java @@ -0,0 +1,7 @@ +package abstract_factorymethod; + +// 추상 팩토리 +public interface ShipPartsFactory { + Anchor createAnchor(); + Wheel createWheel(); +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/Wheel.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/Wheel.java new file mode 100644 index 0000000..fbc9584 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/Wheel.java @@ -0,0 +1,4 @@ +package abstract_factorymethod; + +public interface Wheel { +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteAnchor.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteAnchor.java new file mode 100644 index 0000000..d630b88 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteAnchor.java @@ -0,0 +1,4 @@ +package abstract_factorymethod; + +public class WhiteAnchor implements Anchor { +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteAnchorPro.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteAnchorPro.java new file mode 100644 index 0000000..3adbb44 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteAnchorPro.java @@ -0,0 +1,4 @@ +package abstract_factorymethod; + +public class WhiteAnchorPro implements Anchor{ +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhitePartsProFactory.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhitePartsProFactory.java new file mode 100644 index 0000000..292e300 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhitePartsProFactory.java @@ -0,0 +1,13 @@ +package abstract_factorymethod; + +public class WhitePartsProFactory implements ShipPartsFactory { + @Override + public Anchor createAnchor() { + return new WhiteAnchorPro(); + } + + @Override + public Wheel createWheel() { + return new WhiteWheelPro(); + } +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteShip.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteShip.java new file mode 100644 index 0000000..1eb1266 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteShip.java @@ -0,0 +1,4 @@ +package abstract_factorymethod; + +public class WhiteShip { +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteShipPartsFactory.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteShipPartsFactory.java new file mode 100644 index 0000000..0bcd655 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteShipPartsFactory.java @@ -0,0 +1,13 @@ +package abstract_factorymethod; + +public class WhiteShipPartsFactory implements ShipPartsFactory { + @Override + public Anchor createAnchor() { + return new WhiteAnchor(); + } + + @Override + public Wheel createWheel() { + return new WhiteWheel(); + } +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteWheel.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteWheel.java new file mode 100644 index 0000000..3874ee8 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteWheel.java @@ -0,0 +1,4 @@ +package abstract_factorymethod; + +public class WhiteWheel implements Wheel { +} diff --git a/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteWheelPro.java b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteWheelPro.java new file mode 100644 index 0000000..382cc9d --- /dev/null +++ b/inflearn/design-pattern/src/main/java/abstract_factorymethod/WhiteWheelPro.java @@ -0,0 +1,4 @@ +package abstract_factorymethod; + +public class WhiteWheelPro implements Wheel { +} diff --git a/inflearn/design-pattern/src/main/java/adapter/Account.java b/inflearn/design-pattern/src/main/java/adapter/Account.java new file mode 100644 index 0000000..a92c394 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/adapter/Account.java @@ -0,0 +1,41 @@ +package adapter; + +import adapter.security.UserDetails; + +public class Account implements UserDetails { + + private String name; + + private String password; + + private String email; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String getUsername() { + return this.getName(); + } +} diff --git a/inflearn/design-pattern/src/main/java/adapter/AccountService.java b/inflearn/design-pattern/src/main/java/adapter/AccountService.java new file mode 100644 index 0000000..84031d6 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/adapter/AccountService.java @@ -0,0 +1,28 @@ +package adapter; + +import adapter.security.UserDetails; +import adapter.security.UserDetailsService; + +public class AccountService implements UserDetailsService { + + public Account findAccountByUsername(String username) { + Account account = new Account(); + account.setName(username); + account.setPassword(username); + account.setEmail(username); + return account; + } + + public void createNewAccount(Account account) { + + } + + public void updateAccount(Account account) { + + } + + @Override + public UserDetails loadUser(String username) { + return findAccountByUsername(username); + } +} diff --git a/inflearn/design-pattern/src/main/java/adapter/App.java b/inflearn/design-pattern/src/main/java/adapter/App.java new file mode 100644 index 0000000..1562759 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/adapter/App.java @@ -0,0 +1,12 @@ +package adapter; + +import adapter.security.LoginHandler; + +public class App { + public static void main(String[] args) { + AccountService accountService = new AccountService(); + LoginHandler loginHandler = new LoginHandler(accountService); + String login = loginHandler.login("seansin", "seansin"); + System.out.println(login); + } +} diff --git a/inflearn/design-pattern/src/main/java/adapter/security/LoginHandler.java b/inflearn/design-pattern/src/main/java/adapter/security/LoginHandler.java new file mode 100644 index 0000000..dbd6d2b --- /dev/null +++ b/inflearn/design-pattern/src/main/java/adapter/security/LoginHandler.java @@ -0,0 +1,20 @@ +package adapter.security; + +// 클라이언트 클래스 +public class LoginHandler { + UserDetailsService userDetailsService; + + public LoginHandler(UserDetailsService userDetailsService) { + this.userDetailsService = userDetailsService; + } + + public String login(String username, String password) { + // 타겟 인터페이스 + UserDetails userDetails = userDetailsService.loadUser(username); + if (userDetails.getPassword().equals(password)) { + return userDetails.getUsername(); + } else { + throw new IllegalArgumentException(); + } + } +} diff --git a/inflearn/design-pattern/src/main/java/adapter/security/UserDetails.java b/inflearn/design-pattern/src/main/java/adapter/security/UserDetails.java new file mode 100644 index 0000000..8db6e85 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/adapter/security/UserDetails.java @@ -0,0 +1,6 @@ +package adapter.security; + +public interface UserDetails { + String getPassword(); + String getUsername(); +} diff --git a/inflearn/design-pattern/src/main/java/adapter/security/UserDetailsService.java b/inflearn/design-pattern/src/main/java/adapter/security/UserDetailsService.java new file mode 100644 index 0000000..d2d99e9 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/adapter/security/UserDetailsService.java @@ -0,0 +1,5 @@ +package adapter.security; + +public interface UserDetailsService { + UserDetails loadUser(String username); +} diff --git a/inflearn/design-pattern/src/main/java/bridge/App.java b/inflearn/design-pattern/src/main/java/bridge/App.java new file mode 100644 index 0000000..c3e6141 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/bridge/App.java @@ -0,0 +1,16 @@ +package bridge; + +public class App { + public static void main(String[] args) { + Champion kda = new 아리(new KDA()); + kda.skillQ(); + kda.skillW(); + + // 클라이언트는 Champion (추상적인) 클래스를 사용하고 있다. + // new 아리(new PoolParty()) 이 부분은 의존성 주입하는 방식으로 감출 수 있다. + // 따라서, 구체적인 클래스를 사용하는 것은 아니다. + Champion poolParty = new 아리(new PoolParty()); + poolParty.skillW(); + poolParty.move(); + } +} diff --git a/inflearn/design-pattern/src/main/java/bridge/Champion.java b/inflearn/design-pattern/src/main/java/bridge/Champion.java new file mode 100644 index 0000000..9ec1c7f --- /dev/null +++ b/inflearn/design-pattern/src/main/java/bridge/Champion.java @@ -0,0 +1,13 @@ +package bridge; + +public interface Champion { + void move(); + + void skillQ(); + + void skillW(); + + void skillE(); + + void skillR(); +} diff --git a/inflearn/design-pattern/src/main/java/bridge/DefaultChampion.java b/inflearn/design-pattern/src/main/java/bridge/DefaultChampion.java new file mode 100644 index 0000000..7344dc5 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/bridge/DefaultChampion.java @@ -0,0 +1,38 @@ +package bridge; + +public class DefaultChampion implements Champion { + + private Skin skin; + + private String name; + + public DefaultChampion(Skin skin, String name) { + this.skin = skin; + this.name = name; + } + + @Override + public void move() { + System.out.printf("%s %s move\n", skin.getName(), this.name); + } + + @Override + public void skillQ() { + System.out.printf("%s %s skill Q\n", skin.getName(), this.name); + } + + @Override + public void skillW() { + System.out.printf("%s %s skill W\n", skin.getName(), this.name); + } + + @Override + public void skillE() { + System.out.printf("%s %s skill E\n", skin.getName(), this.name); + } + + @Override + public void skillR() { + System.out.printf("%s %s skill R\n", skin.getName(), this.name); + } +} diff --git a/inflearn/design-pattern/src/main/java/bridge/KDA.java b/inflearn/design-pattern/src/main/java/bridge/KDA.java new file mode 100644 index 0000000..c66a780 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/bridge/KDA.java @@ -0,0 +1,8 @@ +package bridge; + +public class KDA implements Skin { + @Override + public String getName() { + return "KDA"; + } +} diff --git a/inflearn/design-pattern/src/main/java/bridge/PoolParty.java b/inflearn/design-pattern/src/main/java/bridge/PoolParty.java new file mode 100644 index 0000000..4a16dcc --- /dev/null +++ b/inflearn/design-pattern/src/main/java/bridge/PoolParty.java @@ -0,0 +1,8 @@ +package bridge; + +public class PoolParty implements Skin { + @Override + public String getName() { + return "PoolParty"; + } +} diff --git a/inflearn/design-pattern/src/main/java/bridge/Skin.java b/inflearn/design-pattern/src/main/java/bridge/Skin.java new file mode 100644 index 0000000..3e3ff7b --- /dev/null +++ b/inflearn/design-pattern/src/main/java/bridge/Skin.java @@ -0,0 +1,5 @@ +package bridge; + +public interface Skin { + String getName(); +} diff --git "a/inflearn/design-pattern/src/main/java/bridge/\354\225\204\353\246\254.java" "b/inflearn/design-pattern/src/main/java/bridge/\354\225\204\353\246\254.java" new file mode 100644 index 0000000..0e4a8ec --- /dev/null +++ "b/inflearn/design-pattern/src/main/java/bridge/\354\225\204\353\246\254.java" @@ -0,0 +1,8 @@ +package bridge; + +public class 아리 extends DefaultChampion { + + public 아리(Skin skin) { + super(skin, "아리"); + } +} diff --git "a/inflearn/design-pattern/src/main/java/bridge/\354\225\204\354\271\274\353\246\254.java" "b/inflearn/design-pattern/src/main/java/bridge/\354\225\204\354\271\274\353\246\254.java" new file mode 100644 index 0000000..3aefee2 --- /dev/null +++ "b/inflearn/design-pattern/src/main/java/bridge/\354\225\204\354\271\274\353\246\254.java" @@ -0,0 +1,7 @@ +package bridge; + +public class 아칼리 extends DefaultChampion { + public 아칼리(Skin skin) { + super(skin, "아칼리"); + } +} diff --git a/inflearn/design-pattern/src/main/java/builder/App.java b/inflearn/design-pattern/src/main/java/builder/App.java new file mode 100644 index 0000000..8166098 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/builder/App.java @@ -0,0 +1,11 @@ +package builder; + +import java.time.LocalDate; + +public class App { + public static void main(String[] args) { + TourDirector tourDirector = new TourDirector(new DefaultTourBuilder()); + TourPlan tourPlan = tourDirector.cancunTrip(); + TourPlan tourPlan1 = tourDirector.shortTrip(); + } +} diff --git a/inflearn/design-pattern/src/main/java/builder/DefaultTourBuilder.java b/inflearn/design-pattern/src/main/java/builder/DefaultTourBuilder.java new file mode 100644 index 0000000..841d672 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/builder/DefaultTourBuilder.java @@ -0,0 +1,55 @@ +package builder; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class DefaultTourBuilder implements TourPlanBuilder{ + private String title; + + private int nights; + + private int days; + + private LocalDate startAt; + + private String whereToStay; + + private final List plans = new ArrayList<>(); + + @Override + public TourPlanBuilder title(String title) { + this.title = title; + return this; + } + + @Override + public TourPlanBuilder nightsAndDays(int nights, int days) { + this.nights = nights; + this.days = days; + return this; + } + + @Override + public TourPlanBuilder startAt(LocalDate startAt) { + this.startAt = startAt; + return this; + } + + @Override + public TourPlanBuilder whereToStay(String whereToStay) { + this.whereToStay = whereToStay; + return this; + } + + @Override + public TourPlanBuilder addPlan(int day, String plan) { + this.plans.add(new DetailPlan(day, plan)); + return this; + } + + @Override + public TourPlan getPlan() { + return new TourPlan(title, nights, days, startAt, whereToStay, plans); + } +} diff --git a/inflearn/design-pattern/src/main/java/builder/DetailPlan.java b/inflearn/design-pattern/src/main/java/builder/DetailPlan.java new file mode 100644 index 0000000..954f89c --- /dev/null +++ b/inflearn/design-pattern/src/main/java/builder/DetailPlan.java @@ -0,0 +1,35 @@ +package builder; + +public class DetailPlan { + private int day; + private String plan; + + public DetailPlan(int day, String plan) { + this.day = day; + this.plan = plan; + } + + public int getDay() { + return day; + } + + public void setDay(int day) { + this.day = day; + } + + public String getPlan() { + return plan; + } + + public void setPlan(String plan) { + this.plan = plan; + } + + @Override + public String toString() { + return "DetailPlan{" + + "day=" + day + + ", plan='" + plan + '\'' + + '}'; + } +} diff --git a/inflearn/design-pattern/src/main/java/builder/TourDirector.java b/inflearn/design-pattern/src/main/java/builder/TourDirector.java new file mode 100644 index 0000000..85e7778 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/builder/TourDirector.java @@ -0,0 +1,27 @@ +package builder; + +import java.time.LocalDate; + +public class TourDirector { + private TourPlanBuilder builder; + + public TourDirector(TourPlanBuilder builder) { + this.builder = builder; + } + + public TourPlan cancunTrip() { + return builder.title("칸쿤 여행") + .nightsAndDays(2, 3) + .startAt(LocalDate.of(2020, 12, 9)) + .whereToStay("리조트") + .addPlan(0, "체크인하고 짐 풀기") + .addPlan(0, "저녁 식사") + .getPlan(); + } + + public TourPlan shortTrip() { + return builder.title("오레곤 롱비치") + .startAt(LocalDate.of(2021, 7, 15)) + .getPlan(); + } +} diff --git a/inflearn/design-pattern/src/main/java/builder/TourPlan.java b/inflearn/design-pattern/src/main/java/builder/TourPlan.java new file mode 100644 index 0000000..9c77f13 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/builder/TourPlan.java @@ -0,0 +1,91 @@ +package builder; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; + +public class TourPlan { + private String title; + private int nights; + private int days; + private LocalDate startAt; + private String whereToStay; + private List plans = new ArrayList<>(); + + public TourPlan() { + + } + + public TourPlan(String title, int nights, int days, LocalDate startAt, String whereToStay, List plans) { + this.title = title; + this.nights = nights; + this.days = days; + this.startAt = startAt; + this.whereToStay = whereToStay; + this.plans = plans; + } + + public void addPlan(int day, String plan) { + this.plans.add(new DetailPlan(day, plan)); + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getNights() { + return nights; + } + + public void setNights(int nights) { + this.nights = nights; + } + + public int getDays() { + return days; + } + + public void setDays(int days) { + this.days = days; + } + + public LocalDate getStartAt() { + return startAt; + } + + public void setStartAt(LocalDate startAt) { + this.startAt = startAt; + } + + public String getWhereToStay() { + return whereToStay; + } + + public void setWhereToStay(String whereToStay) { + this.whereToStay = whereToStay; + } + + public List getPlans() { + return plans; + } + + public void setPlans(List plans) { + this.plans = plans; + } + + @Override + public String toString() { + return "TourPlan{" + + "title='" + title + '\'' + + ", nights=" + nights + + ", days=" + days + + ", startAt=" + startAt + + ", whereToStay='" + whereToStay + '\'' + + ", plans=" + plans + + '}'; + } +} diff --git a/inflearn/design-pattern/src/main/java/builder/TourPlanBuilder.java b/inflearn/design-pattern/src/main/java/builder/TourPlanBuilder.java new file mode 100644 index 0000000..363f347 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/builder/TourPlanBuilder.java @@ -0,0 +1,12 @@ +package builder; + +import java.time.LocalDate; + +public interface TourPlanBuilder { + TourPlanBuilder title(String title); + TourPlanBuilder nightsAndDays(int nights, int days); + TourPlanBuilder startAt(LocalDate startAt); + TourPlanBuilder whereToStay(String whereToStay); + TourPlanBuilder addPlan(int day, String plan); + TourPlan getPlan(); +} diff --git a/inflearn/design-pattern/src/main/java/composite/Bag.java b/inflearn/design-pattern/src/main/java/composite/Bag.java new file mode 100644 index 0000000..e0c4e35 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/composite/Bag.java @@ -0,0 +1,24 @@ +package composite; + +import java.util.ArrayList; +import java.util.List; + +// Composite 객체이므로 Item을 참조하면 안된다. +public class Bag implements Component { + private final List components = new ArrayList<>(); + + public void add(Component item) { + components.add(item); + } + + public List getComponents() { + return new ArrayList<>(components); + } + + @Override + public int getPrice() { + return components.stream() + .mapToInt(Component::getPrice) + .sum(); + } +} diff --git a/inflearn/design-pattern/src/main/java/composite/Client.java b/inflearn/design-pattern/src/main/java/composite/Client.java new file mode 100644 index 0000000..644149e --- /dev/null +++ b/inflearn/design-pattern/src/main/java/composite/Client.java @@ -0,0 +1,20 @@ +package composite; + +public class Client { + public static void main(String[] args) { + Item doranBlade = new Item("도란검", 450); + Item healPotion = new Item("체력 물약", 50); + + Bag bag = new Bag(); + bag.add(doranBlade); + bag.add(healPotion); + + Client client = new Client(); + client.printPrice(doranBlade); + client.printPrice(bag); + } + + private void printPrice(Component component) { + System.out.println(component.getPrice()); + } +} diff --git a/inflearn/design-pattern/src/main/java/composite/Component.java b/inflearn/design-pattern/src/main/java/composite/Component.java new file mode 100644 index 0000000..89d1dc1 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/composite/Component.java @@ -0,0 +1,6 @@ +package composite; + +// 공통된 오퍼레이션을 제공해야한다. +public interface Component { + int getPrice(); +} diff --git a/inflearn/design-pattern/src/main/java/composite/Item.java b/inflearn/design-pattern/src/main/java/composite/Item.java new file mode 100644 index 0000000..9a44bd4 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/composite/Item.java @@ -0,0 +1,30 @@ +package composite; + +public class Item implements Component { + + private String name; + + private int price; + + public Item(String name, int price) { + this.name = name; + this.price = price; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } +} diff --git a/inflearn/design-pattern/src/main/java/factorymethod/BlackShip.java b/inflearn/design-pattern/src/main/java/factorymethod/BlackShip.java new file mode 100644 index 0000000..2411d8e --- /dev/null +++ b/inflearn/design-pattern/src/main/java/factorymethod/BlackShip.java @@ -0,0 +1,9 @@ +package factorymethod; + +public class BlackShip extends Ship { + public BlackShip() { + setName("blackship"); + setLogo("⚓"); + setColor("black"); + } +} diff --git a/inflearn/design-pattern/src/main/java/factorymethod/BlackShipFactory.java b/inflearn/design-pattern/src/main/java/factorymethod/BlackShipFactory.java new file mode 100644 index 0000000..ffa2766 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/factorymethod/BlackShipFactory.java @@ -0,0 +1,8 @@ +package factorymethod; + +public class BlackShipFactory implements ShipFactory { + @Override + public Ship createShip() { + return new BlackShip(); + } +} diff --git a/inflearn/design-pattern/src/main/java/factorymethod/Client.java b/inflearn/design-pattern/src/main/java/factorymethod/Client.java new file mode 100644 index 0000000..a3c0806 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/factorymethod/Client.java @@ -0,0 +1,13 @@ +package factorymethod; + +public class Client { + public static void main(String[] args) { + Client client = new Client(); +// client.print(new WhiteShipFactory(), "WhiteShip", "workingssu@gmail.com"); +// client.print(new BlackShipFactory(), "BlackShip", "workingssu@gmail.com"); + } + + private void print(ShipFactory shipFactory, String name, String email) { + System.out.println(shipFactory.orderShip(name, email)); + } +} diff --git a/inflearn/design-pattern/src/main/java/factorymethod/Ship.java b/inflearn/design-pattern/src/main/java/factorymethod/Ship.java new file mode 100644 index 0000000..5d171c6 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/factorymethod/Ship.java @@ -0,0 +1,55 @@ +package factorymethod; + +import abstract_factorymethod.Anchor; +import abstract_factorymethod.Wheel; +import abstract_factorymethod.WhiteAnchor; +import abstract_factorymethod.WhiteWheel; + +public class Ship { + private String name; + private String logo; + private String color; + private Anchor anchor; + private Wheel wheel; + + public String getName() { + return name; + } + + public Anchor getAnchor() { + return anchor; + } + + public Wheel getWheel() { + return wheel; + } + + public void setName(String name) { + this.name = name; + } + + public void setLogo(String logo) { + this.logo = logo; + } + + public void setColor(String color) { + this.color = color; + } + + public void setAnchor(Anchor anchor) { + this.anchor = anchor; + } + + public void setWheel(Wheel wheel) { + this.wheel = wheel; + } + + @Override + public String toString() { + return "Ship{" + + "name='" + name + '\'' + + ", logo='" + logo + '\'' + + ", color='" + color + '\'' + + '}'; + } +} diff --git a/inflearn/design-pattern/src/main/java/factorymethod/ShipFactory.java b/inflearn/design-pattern/src/main/java/factorymethod/ShipFactory.java new file mode 100644 index 0000000..7b05550 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/factorymethod/ShipFactory.java @@ -0,0 +1,32 @@ +package factorymethod; + +public interface ShipFactory { + default Ship orderShip(String name, String email) { + validate(name, email); + prepareFor(name); + Ship ship = createShip(); + sendEmailTo(email, ship); + return ship; + } + + Ship createShip(); + + private void sendEmailTo(String email, Ship ship) { + System.out.println(ship.getName() + "만들어졌습니다."); + System.out.println(email + "에게 " + ship.getName() + "이 완성됐음을 이메일로 알림을 보냈습니다."); + } + + private void validate(String name, String email) { + if(name == null || name.isBlank()) { + throw new IllegalArgumentException("배 이름을 지어주세요."); + } + + if(email == null || email.isBlank()) { + throw new IllegalArgumentException("연락처를 남겨주세요."); + } + } + + private static void prepareFor(String name) { + System.out.println(name + "만들 준비 중.."); + } +} diff --git a/inflearn/design-pattern/src/main/java/factorymethod/WhiteShip.java b/inflearn/design-pattern/src/main/java/factorymethod/WhiteShip.java new file mode 100644 index 0000000..1dd9d67 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/factorymethod/WhiteShip.java @@ -0,0 +1,9 @@ +package factorymethod; + +public class WhiteShip extends Ship{ + public WhiteShip() { + setName("whiteship"); + setLogo("\uD83D\uDEE5"); + setColor("white"); + } +} diff --git a/inflearn/design-pattern/src/main/java/factorymethod/WhiteShipFactory.java b/inflearn/design-pattern/src/main/java/factorymethod/WhiteShipFactory.java new file mode 100644 index 0000000..0f2bb69 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/factorymethod/WhiteShipFactory.java @@ -0,0 +1,19 @@ +package factorymethod; + +import abstract_factorymethod.ShipPartsFactory; + +public class WhiteShipFactory implements ShipFactory { + private final ShipPartsFactory shipPartsFactory; + + public WhiteShipFactory(ShipPartsFactory shipPartsFactory) { + this.shipPartsFactory = shipPartsFactory; + } + + @Override + public Ship createShip() { + Ship whiteShip = new WhiteShip(); + whiteShip.setAnchor(shipPartsFactory.createAnchor()); + whiteShip.setWheel(shipPartsFactory.createWheel()); + return whiteShip; + } +} diff --git a/inflearn/design-pattern/src/main/java/prototype/App.java b/inflearn/design-pattern/src/main/java/prototype/App.java new file mode 100644 index 0000000..561ee65 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/prototype/App.java @@ -0,0 +1,25 @@ +package prototype; + +public class App { + public static void main(String[] args) throws CloneNotSupportedException { + GithubRepository repository = new GithubRepository(); + repository.setUser("whiteship"); + repository.setName("live-study"); + + GithubIssue githubIssue = new GithubIssue(repository); + githubIssue.setId(1); + githubIssue.setTitle("1주차 과제 : JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가."); + + GithubIssue clone = (GithubIssue) githubIssue.clone(); + + repository.setUser("seansin"); + System.out.println(githubIssue.getUrl()); + System.out.println(clone.getUrl()); + + System.out.println(clone != githubIssue); + System.out.println(clone.equals(githubIssue)); + System.out.println(clone.getClass() == githubIssue.getClass()); + System.out.println(clone.getGithubRepository() == githubIssue.getGithubRepository()); + + } +} diff --git a/inflearn/design-pattern/src/main/java/prototype/GithubIssue.java b/inflearn/design-pattern/src/main/java/prototype/GithubIssue.java new file mode 100644 index 0000000..8132c35 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/prototype/GithubIssue.java @@ -0,0 +1,77 @@ +package prototype; + +import java.util.Objects; + +public class GithubIssue implements Cloneable { + private int id; + + private String title; + + private GithubRepository githubRepository; + + private String url; + + public String getUrl() { + return String.format("https://github.com/%s/%s/issues/%d", + githubRepository.getUser(), + githubRepository.getName(), + this.getId()); + } + + public void setUrl(String url) { + this.url = url; + } + + public GithubIssue(GithubRepository githubRepository) { + this.githubRepository = githubRepository; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public GithubRepository getGithubRepository() { + return githubRepository; + } + + public void setGithubRepository(GithubRepository githubRepository) { + this.githubRepository = githubRepository; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + GithubRepository repository = new GithubRepository(); + repository.setUser(this.githubRepository.getUser()); + repository.setName(this.githubRepository.getName()); + + GithubIssue githubIssue = new GithubIssue(repository); + githubIssue.setId(this.id); + githubIssue.setTitle(this.title); + return githubIssue; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GithubIssue that = (GithubIssue) o; + return id == that.id && Objects.equals(title, that.title) && Objects.equals(githubRepository, that.githubRepository) && Objects.equals(url, that.url); + } + + @Override + public int hashCode() { + return Objects.hash(id, title, githubRepository, url); + } +} diff --git a/inflearn/design-pattern/src/main/java/prototype/GithubRepository.java b/inflearn/design-pattern/src/main/java/prototype/GithubRepository.java new file mode 100644 index 0000000..9a135da --- /dev/null +++ b/inflearn/design-pattern/src/main/java/prototype/GithubRepository.java @@ -0,0 +1,24 @@ +package prototype; + +public class GithubRepository { + + private String user; + + private String name; + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/inflearn/design-pattern/src/main/java/singletone/App.java b/inflearn/design-pattern/src/main/java/singletone/App.java new file mode 100644 index 0000000..564daa9 --- /dev/null +++ b/inflearn/design-pattern/src/main/java/singletone/App.java @@ -0,0 +1,13 @@ +package singletone; + +import java.io.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + +public class App { + public static void main(String[] args) throws IOException, ClassNotFoundException { + Runtime runtime = Runtime.getRuntime(); + System.out.println(runtime.maxMemory()); + System.out.println(runtime.freeMemory()); + } +} diff --git a/inflearn/design-pattern/src/main/java/singletone/Settings.java b/inflearn/design-pattern/src/main/java/singletone/Settings.java new file mode 100644 index 0000000..4b671ea --- /dev/null +++ b/inflearn/design-pattern/src/main/java/singletone/Settings.java @@ -0,0 +1,16 @@ +package singletone; + +import java.io.Serializable; + +public class Settings implements Serializable { + private Settings() { + } + + private static class SettingsHolder { + private static final Settings INSTANCE = new Settings(); + } + + public static Settings getInstance() { + return SettingsHolder.INSTANCE; + } +}