diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..49329a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.gradle/ +.build/ +.idea/ +gradlew* \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..25eaeef --- /dev/null +++ b/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'java' +} + +group 'org.example' +version '1.0-SNAPSHOT' + +sourceCompatibility = 1.8 + +repositories { + mavenCentral() +} + +test { + useJUnitPlatform() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1' +} \ No newline at end of file diff --git a/build/classes/java/main/command/AddComissionedEmployeeTransaction.class b/build/classes/java/main/command/AddComissionedEmployeeTransaction.class new file mode 100644 index 0000000..0ee4225 Binary files /dev/null and b/build/classes/java/main/command/AddComissionedEmployeeTransaction.class differ diff --git a/build/classes/java/main/command/AddEmploy.class b/build/classes/java/main/command/AddEmploy.class new file mode 100644 index 0000000..28fb877 Binary files /dev/null and b/build/classes/java/main/command/AddEmploy.class differ diff --git a/build/classes/java/main/command/AddEmployTransaction.class b/build/classes/java/main/command/AddEmployTransaction.class new file mode 100644 index 0000000..373ba05 Binary files /dev/null and b/build/classes/java/main/command/AddEmployTransaction.class differ diff --git a/build/classes/java/main/command/AddHourlyEmployeeTransaction.class b/build/classes/java/main/command/AddHourlyEmployeeTransaction.class new file mode 100644 index 0000000..69fa7f1 Binary files /dev/null and b/build/classes/java/main/command/AddHourlyEmployeeTransaction.class differ diff --git a/build/classes/java/main/command/AddMonthlyEmployeeTransaction.class b/build/classes/java/main/command/AddMonthlyEmployeeTransaction.class new file mode 100644 index 0000000..05b9ee5 Binary files /dev/null and b/build/classes/java/main/command/AddMonthlyEmployeeTransaction.class differ diff --git a/build/classes/java/main/command/Client.class b/build/classes/java/main/command/Client.class new file mode 100644 index 0000000..a5899fe Binary files /dev/null and b/build/classes/java/main/command/Client.class differ diff --git a/build/classes/java/main/command/Transaction.class b/build/classes/java/main/command/Transaction.class new file mode 100644 index 0000000..9202725 Binary files /dev/null and b/build/classes/java/main/command/Transaction.class differ diff --git a/build/classes/java/main/templatemethod/Client.class b/build/classes/java/main/templatemethod/Client.class new file mode 100644 index 0000000..5f15f7d Binary files /dev/null and b/build/classes/java/main/templatemethod/Client.class differ diff --git a/build/classes/java/main/templatemethod/Direction.class b/build/classes/java/main/templatemethod/Direction.class new file mode 100644 index 0000000..c6323cd Binary files /dev/null and b/build/classes/java/main/templatemethod/Direction.class differ diff --git a/build/classes/java/main/templatemethod/Door$DoorStatus.class b/build/classes/java/main/templatemethod/Door$DoorStatus.class new file mode 100644 index 0000000..dfb3d17 Binary files /dev/null and b/build/classes/java/main/templatemethod/Door$DoorStatus.class differ diff --git a/build/classes/java/main/templatemethod/Door.class b/build/classes/java/main/templatemethod/Door.class new file mode 100644 index 0000000..bc8bcd8 Binary files /dev/null and b/build/classes/java/main/templatemethod/Door.class differ diff --git a/build/classes/java/main/templatemethod/HyundaiMotor.class b/build/classes/java/main/templatemethod/HyundaiMotor.class new file mode 100644 index 0000000..15cde27 Binary files /dev/null and b/build/classes/java/main/templatemethod/HyundaiMotor.class differ diff --git a/build/classes/java/main/templatemethod/LgMotor.class b/build/classes/java/main/templatemethod/LgMotor.class new file mode 100644 index 0000000..2462005 Binary files /dev/null and b/build/classes/java/main/templatemethod/LgMotor.class differ diff --git a/build/classes/java/main/templatemethod/Motor$MotorStatus.class b/build/classes/java/main/templatemethod/Motor$MotorStatus.class new file mode 100644 index 0000000..1a56acc Binary files /dev/null and b/build/classes/java/main/templatemethod/Motor$MotorStatus.class differ diff --git a/build/classes/java/main/templatemethod/Motor.class b/build/classes/java/main/templatemethod/Motor.class new file mode 100644 index 0000000..0592cf5 Binary files /dev/null and b/build/classes/java/main/templatemethod/Motor.class differ diff --git a/build/libs/design-pattern-1.0-SNAPSHOT.jar b/build/libs/design-pattern-1.0-SNAPSHOT.jar new file mode 100644 index 0000000..0c42abc Binary files /dev/null and b/build/libs/design-pattern-1.0-SNAPSHOT.jar differ diff --git a/build/tmp/jar/MANIFEST.MF b/build/tmp/jar/MANIFEST.MF new file mode 100644 index 0000000..58630c0 --- /dev/null +++ b/build/tmp/jar/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..f3d88b1 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..1b16c34 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/src/main/java/abstractserver/example/Light.java b/src/main/java/abstractserver/example/Light.java new file mode 100644 index 0000000..4ebb52c --- /dev/null +++ b/src/main/java/abstractserver/example/Light.java @@ -0,0 +1,15 @@ +package abstractserver.example; + +public class Light implements Swtichable{ + + @Override + public void on() { + System.out.println("Light On"); + + } + + @Override + public void off() { + System.out.println("Light Off"); + } +} diff --git a/src/main/java/abstractserver/example/Switch.java b/src/main/java/abstractserver/example/Switch.java new file mode 100644 index 0000000..810f4ed --- /dev/null +++ b/src/main/java/abstractserver/example/Switch.java @@ -0,0 +1,10 @@ +package abstractserver.example; + +public class Switch { + public static void main(String[] args) { + Swtichable swtichable = new Light(); + + swtichable.on(); + swtichable.off(); + } +} diff --git a/src/main/java/abstractserver/example/Swtichable.java b/src/main/java/abstractserver/example/Swtichable.java new file mode 100644 index 0000000..52b6faf --- /dev/null +++ b/src/main/java/abstractserver/example/Swtichable.java @@ -0,0 +1,6 @@ +package abstractserver.example; + +public interface Swtichable { + void on(); + void off(); +} diff --git a/src/main/java/adapter/DedicatedModem.java b/src/main/java/adapter/DedicatedModem.java new file mode 100644 index 0000000..fceebdd --- /dev/null +++ b/src/main/java/adapter/DedicatedModem.java @@ -0,0 +1,11 @@ +package adapter; + +public class DedicatedModem { + public void send() { + System.out.println("Dedicated Modem send"); + } + + public void receive() { + System.out.println("Dedicated Modem receive"); + } +} diff --git a/src/main/java/adapter/DedicatedModemAdapter.java b/src/main/java/adapter/DedicatedModemAdapter.java new file mode 100644 index 0000000..7a5f0ca --- /dev/null +++ b/src/main/java/adapter/DedicatedModemAdapter.java @@ -0,0 +1,30 @@ +package adapter; + +import bridge.Modem; + +public class DedicatedModemAdapter implements Modem { + private DedicatedModem dedicatedModem; + + public DedicatedModemAdapter(DedicatedModem delegateModem) { + this.dedicatedModem = delegateModem; + } + + @Override + public void dial(char[] a) { + } + + @Override + public void hangup() { + + } + + @Override + public void send() { + dedicatedModem.send(); + } + + @Override + public void receive() { + dedicatedModem.receive(); + } +} diff --git a/src/main/java/adapter/Deduser.java b/src/main/java/adapter/Deduser.java new file mode 100644 index 0000000..db3479f --- /dev/null +++ b/src/main/java/adapter/Deduser.java @@ -0,0 +1,10 @@ +package adapter; + +public class Deduser { + private DedicatedModem modem = new DedicatedModem(); + + public void messageProcess() { + this.modem.send(); + this.modem.receive(); + } +} diff --git a/src/main/java/adapter/ModemImpl.java b/src/main/java/adapter/ModemImpl.java new file mode 100644 index 0000000..ea8f83a --- /dev/null +++ b/src/main/java/adapter/ModemImpl.java @@ -0,0 +1,11 @@ +package adapter; + +public class ModemImpl { + public void dial(char[] a) { + System.out.println("Modem Impl dial"); + } + + public void hangup() { + System.out.println("Modem Impl hangup"); + } +} diff --git a/src/main/java/adapter/ModemImplAdapter.java b/src/main/java/adapter/ModemImplAdapter.java new file mode 100644 index 0000000..85cd418 --- /dev/null +++ b/src/main/java/adapter/ModemImplAdapter.java @@ -0,0 +1,30 @@ +package adapter; + +import bridge.Modem; + +public class ModemImplAdapter implements Modem { + private ModemImpl modemImpl; + + public ModemImplAdapter(ModemImpl modemImpl) { + this.modemImpl = modemImpl; + } + @Override + public void dial(char[] a) { + + } + + @Override + public void hangup() { + + } + + @Override + public void send() { + + } + + @Override + public void receive() { + + } +} diff --git a/src/main/java/bridge/DedModemController.java b/src/main/java/bridge/DedModemController.java new file mode 100644 index 0000000..d6eef3e --- /dev/null +++ b/src/main/java/bridge/DedModemController.java @@ -0,0 +1,28 @@ +package bridge; + +public class DedModemController extends ModemConnectionController { + public DedModemController(ModemImplementation modemImplementation) { + super(modemImplementation); + } + + @Override + protected void dialImpl(char[] a) { + System.out.println("DedModem DialImpl"); +// super.dialImpl(a); + } + + @Override + protected void hangImpl() { + System.out.println("DedModem hangImpl"); + } + + @Override + protected void sendImpl() { +// super.sendImpl(); + } + + @Override + protected void receiveImpl() { +// super.receiveImpl(); + } +} diff --git a/src/main/java/bridge/DedicatedModem.java b/src/main/java/bridge/DedicatedModem.java new file mode 100644 index 0000000..8b2338d --- /dev/null +++ b/src/main/java/bridge/DedicatedModem.java @@ -0,0 +1,6 @@ +package bridge; + +public interface DedicatedModem { + void send(); + void receive(); +} diff --git a/src/main/java/bridge/DialModemController.java b/src/main/java/bridge/DialModemController.java new file mode 100644 index 0000000..f11f6f8 --- /dev/null +++ b/src/main/java/bridge/DialModemController.java @@ -0,0 +1,8 @@ +package bridge; + +public class DialModemController extends ModemConnectionController { + public DialModemController(ModemImplementation modemImplementation) { + super(modemImplementation); + } + +} diff --git a/src/main/java/bridge/HayesModem.java b/src/main/java/bridge/HayesModem.java new file mode 100644 index 0000000..50a9bf0 --- /dev/null +++ b/src/main/java/bridge/HayesModem.java @@ -0,0 +1,23 @@ +package bridge; + +public class HayesModem implements ModemImplementation { + @Override + public void dial(char[] a) { + System.out.println("hayes modem dial"); + } + + @Override + public void hangup() { + System.out.println("hayes modem hangup"); + } + + @Override + public void send() { + System.out.println("hayes modem send"); + } + + @Override + public void receive() { + System.out.println("hayes modem receive"); + } +} diff --git a/src/main/java/bridge/Modem.java b/src/main/java/bridge/Modem.java new file mode 100644 index 0000000..a82c3f2 --- /dev/null +++ b/src/main/java/bridge/Modem.java @@ -0,0 +1,8 @@ +package bridge; + +public interface Modem { + void dial(char[] a); + void hangup(); + void send(); + void receive(); +} diff --git a/src/main/java/bridge/ModemClients.java b/src/main/java/bridge/ModemClients.java new file mode 100644 index 0000000..3efae8c --- /dev/null +++ b/src/main/java/bridge/ModemClients.java @@ -0,0 +1,11 @@ +package bridge; + +public class ModemClients { + public static void main(String[] args) { + Modem modem = new DedModemController(new UsRoboticsModem()); + + modem.receive(); + modem.send(); + + } +} diff --git a/src/main/java/bridge/ModemConnectionController.java b/src/main/java/bridge/ModemConnectionController.java new file mode 100644 index 0000000..f0201f1 --- /dev/null +++ b/src/main/java/bridge/ModemConnectionController.java @@ -0,0 +1,45 @@ +package bridge; + +public abstract class ModemConnectionController implements Modem, DedicatedModem { + ModemImplementation modemImplementation; + + public ModemConnectionController(ModemImplementation modemImplementation) { + this.modemImplementation = modemImplementation; + } + + protected void dialImpl(char[] a) { + modemImplementation.dial(a); + } + + protected void hangImpl() { + modemImplementation.hangup(); + } + + protected void sendImpl() { + modemImplementation.send(); + } + + protected void receiveImpl() { + modemImplementation.receive();; + } + + @Override + public void dial(char[] a) { + this.dialImpl(a); + } + + @Override + public void hangup() { + this.hangImpl(); + } + + @Override + public void send() { + this.sendImpl(); + } + + @Override + public void receive() { + this.receiveImpl(); + } +} diff --git a/src/main/java/bridge/ModemImplementation.java b/src/main/java/bridge/ModemImplementation.java new file mode 100644 index 0000000..accf6cc --- /dev/null +++ b/src/main/java/bridge/ModemImplementation.java @@ -0,0 +1,11 @@ +package bridge; + +public interface ModemImplementation { + void dial(char[] a); + + void hangup(); + + void send(); + + void receive(); +} \ No newline at end of file diff --git a/src/main/java/bridge/UsRoboticsModem.java b/src/main/java/bridge/UsRoboticsModem.java new file mode 100644 index 0000000..0d5154e --- /dev/null +++ b/src/main/java/bridge/UsRoboticsModem.java @@ -0,0 +1,25 @@ +package bridge; + +import bridge.Modem; + +public class UsRoboticsModem implements ModemImplementation { + @Override + public void dial(char[] a) { + System.out.println("US Robotics dial"); + } + + @Override + public void hangup() { + System.out.println("US Robotics hangup"); + } + + @Override + public void send() { + System.out.println("US Robotics send"); + } + + @Override + public void receive() { + System.out.println("US Robotics receive"); + } +} diff --git a/src/main/java/command/AddComissionedEmployeeTransaction.java b/src/main/java/command/AddComissionedEmployeeTransaction.java new file mode 100644 index 0000000..4541b16 --- /dev/null +++ b/src/main/java/command/AddComissionedEmployeeTransaction.java @@ -0,0 +1,15 @@ +package command; + +public class AddComissionedEmployeeTransaction extends AddEmployTransaction { + private double commission; + + public AddComissionedEmployeeTransaction(String name, int employeeId, String address, int salary, double commission) { + super(name, employeeId, address, salary); + this.commission = commission; + } + + @Override + public void execute() { + System.out.printf("%s 직원은 월급을 %d원을 받고 추가 수수료율 %f%%를 적용합니다.\n", this.getName(), this.getSalary(), this.commission); + } +} diff --git a/src/main/java/command/AddEmploy.java b/src/main/java/command/AddEmploy.java new file mode 100644 index 0000000..d031cc4 --- /dev/null +++ b/src/main/java/command/AddEmploy.java @@ -0,0 +1,16 @@ +package command; + +/** + * Invoker + */ +public class AddEmploy { + private Transaction transaction; + + public AddEmploy(Transaction transaction) { + this.transaction = transaction; + } + + public void add() { + transaction.execute(); + } +} diff --git a/src/main/java/command/AddEmployTransaction.java b/src/main/java/command/AddEmployTransaction.java new file mode 100644 index 0000000..b156352 --- /dev/null +++ b/src/main/java/command/AddEmployTransaction.java @@ -0,0 +1,31 @@ +package command; + +public abstract class AddEmployTransaction implements Transaction { + private String name; + private int employeeId; + private String address; + private int salary; + + protected AddEmployTransaction(String name, int employeeId, String address, int salary) { + this.name = name; + this.employeeId = employeeId; + this.address = address; + this.salary = salary; + } + + protected String getName() { + return name; + } + + protected int getEmployeeId() { + return employeeId; + } + + protected String getAddress() { + return address; + } + + protected int getSalary() { + return salary; + } +} diff --git a/src/main/java/command/AddHourlyEmployeeTransaction.java b/src/main/java/command/AddHourlyEmployeeTransaction.java new file mode 100644 index 0000000..4cbf0c0 --- /dev/null +++ b/src/main/java/command/AddHourlyEmployeeTransaction.java @@ -0,0 +1,13 @@ +package command; + +public class AddHourlyEmployeeTransaction extends AddEmployTransaction { + + public AddHourlyEmployeeTransaction(String name, int employeeId, String address, int salary) { + super(name, employeeId, address, salary); + } + + @Override + public void execute() { + System.out.printf("%s 직원은 시급을 %d원 받습니다.\n", this.getName(), this.getSalary()); + } +} diff --git a/src/main/java/command/AddMonthlyEmployeeTransaction.java b/src/main/java/command/AddMonthlyEmployeeTransaction.java new file mode 100644 index 0000000..769d42e --- /dev/null +++ b/src/main/java/command/AddMonthlyEmployeeTransaction.java @@ -0,0 +1,12 @@ +package command; + +public class AddMonthlyEmployeeTransaction extends AddEmployTransaction { + public AddMonthlyEmployeeTransaction(String name, int employeeId, String address, int salary) { + super(name, employeeId, address, salary); + } + + @Override + public void execute() { + System.out.printf("%s 직원은 월급을 %d원 받습니다.\n", this.getName(), this.getSalary()); + } +} diff --git a/src/main/java/command/Client.java b/src/main/java/command/Client.java new file mode 100644 index 0000000..001613b --- /dev/null +++ b/src/main/java/command/Client.java @@ -0,0 +1,17 @@ +package command; + +public class Client { + public static void main(String[] args) { + AddHourlyEmployeeTransaction addHourlyEmployee = new AddHourlyEmployeeTransaction("김아름", 1, "임의의 주소", 10000); + AddEmploy addEmploy = new AddEmploy(addHourlyEmployee); + addEmploy.add(); + + AddMonthlyEmployeeTransaction addMonthlyEmployee = new AddMonthlyEmployeeTransaction("김직원", 2, "한국 임의의 주소", 1000000); + AddEmploy addEmploy2 = new AddEmploy(addMonthlyEmployee); + addEmploy2.add(); + + AddComissionedEmployeeTransaction addCommissionedEmployee = new AddComissionedEmployeeTransaction("김임원", 3, "미국 임의의 주소", 10000000, 10); + AddEmploy addEmploy3 = new AddEmploy(addCommissionedEmployee); + addEmploy3.add(); + } +} diff --git a/src/main/java/command/Transaction.java b/src/main/java/command/Transaction.java new file mode 100644 index 0000000..4c2dd2d --- /dev/null +++ b/src/main/java/command/Transaction.java @@ -0,0 +1,8 @@ +package command; + +/** + * Command + */ +public interface Transaction { + void execute(); +} diff --git a/src/main/java/composite/Body.java b/src/main/java/composite/Body.java new file mode 100644 index 0000000..4cdb887 --- /dev/null +++ b/src/main/java/composite/Body.java @@ -0,0 +1,21 @@ +package composite; + +public class Body implements Computer { + private int price; + private int power; + + public Body(int price, int power) { + this.price = price; + this.power = power; + } + + @Override + public int getPrice() { + return price; + } + + @Override + public int getPower() { + return power; + } +} diff --git a/src/main/java/composite/Client.java b/src/main/java/composite/Client.java new file mode 100644 index 0000000..67f05b2 --- /dev/null +++ b/src/main/java/composite/Client.java @@ -0,0 +1,17 @@ +package composite; + +public class Client { + public static void main(String[] args) { + Keyboard keyboard = new Keyboard(5, 2); + Monitor monitor = new Monitor(10, 20); + Speaker speaker = new Speaker(30, 20); + + CompositeComputer compositeComputer = new CompositeComputer(); + compositeComputer.addComponent(keyboard); + compositeComputer.addComponent(monitor); + compositeComputer.addComponent(speaker); + + System.out.printf("Computer Price : %d\n", compositeComputer.getPrice()); + System.out.printf("Computer Power : %d\n", compositeComputer.getPower()); + } +} diff --git a/src/main/java/composite/CompositeComputer.java b/src/main/java/composite/CompositeComputer.java new file mode 100644 index 0000000..5f42999 --- /dev/null +++ b/src/main/java/composite/CompositeComputer.java @@ -0,0 +1,30 @@ +package composite; + +import java.util.ArrayList; +import java.util.List; + +public class CompositeComputer implements Computer{ + private List components = new ArrayList<>(); + + public void addComponent(Computer computer) { + this.components.add(computer); + } + + @Override + public int getPrice() { + int price = 0; + for (Computer computer : components) { + price += computer.getPrice(); + } + return price; + } + + @Override + public int getPower() { + int power = 0; + for (Computer computer : components) { + power += computer.getPower(); + } + return power; + } +} diff --git a/src/main/java/composite/Computer.java b/src/main/java/composite/Computer.java new file mode 100644 index 0000000..f4b5938 --- /dev/null +++ b/src/main/java/composite/Computer.java @@ -0,0 +1,6 @@ +package composite; + +public interface Computer { + int getPrice(); + int getPower(); +} diff --git a/src/main/java/composite/Keyboard.java b/src/main/java/composite/Keyboard.java new file mode 100644 index 0000000..9383ec8 --- /dev/null +++ b/src/main/java/composite/Keyboard.java @@ -0,0 +1,21 @@ +package composite; + +public class Keyboard implements Computer { + private int price; + private int power; + + public Keyboard(int price, int power) { + this.price = price; + this.power = power; + } + + @Override + public int getPrice() { + return price; + } + + @Override + public int getPower() { + return power; + } +} diff --git a/src/main/java/composite/Monitor.java b/src/main/java/composite/Monitor.java new file mode 100644 index 0000000..9e092ed --- /dev/null +++ b/src/main/java/composite/Monitor.java @@ -0,0 +1,21 @@ +package composite; + +public class Monitor implements Computer { + private int price; + private int power; + + public Monitor(int price, int power) { + this.price = price; + this.power = power; + } + + @Override + public int getPrice() { + return price; + } + + @Override + public int getPower() { + return power; + } +} diff --git a/src/main/java/composite/Speaker.java b/src/main/java/composite/Speaker.java new file mode 100644 index 0000000..a29a54d --- /dev/null +++ b/src/main/java/composite/Speaker.java @@ -0,0 +1,21 @@ +package composite; + +public class Speaker implements Computer { + private int price; + private int power; + + public Speaker(int price, int power) { + this.price = price; + this.power = power; + } + + @Override + public int getPrice() { + return price; + } + + @Override + public int getPower() { + return power; + } +} diff --git a/src/main/java/composite/composite.png b/src/main/java/composite/composite.png new file mode 100644 index 0000000..67d4657 Binary files /dev/null and b/src/main/java/composite/composite.png differ diff --git a/src/main/java/composite/definition.md b/src/main/java/composite/definition.md new file mode 100644 index 0000000..30518d3 --- /dev/null +++ b/src/main/java/composite/definition.md @@ -0,0 +1,18 @@ +# Composite Pattern +여러 개의 객체들로 구성된 복합 객체와 단일 객체를 클라이언트에서 구별없이 다루게 해주는 패턴 +- 전체-부분의 관계 (이를테면 디렉토리-파일)를 갖는 객체들 사이의 관계를 정의할 때 유용하다. + +![Composite](./composite.png) + +## 구성요소 +- Component : 구체적인 부분, 즉 Leaf 클래스와 전체에 해당하는 Compoite 클래스에 공통 인터페이스를 정의 +- Leaf : 구체적인 부분 클래스, Composite 객체의 부품으로 설정 +- Composite : 전체 클래스, 복수개의 컴포넌트를 갖도록 정의하며 복수개의 Leaf, 복수개의 Compoite 객체를 부분으로 가질 수 있음. + + +## 특징 +이 패턴을 사용하면 부분 객체의 추가나 삭제 등이 있어도 전체 객체의 클래스 코드를 변경하지 않아도 된다. +일대다 관계의 행위를 이해하기 쉽게 설계할 수 있음. + +## 데코레이터 패턴과의 차이점 +https://stackoverflow.com/questions/2233952/difference-between-the-composite-pattern-and-decorator-pattern diff --git a/src/main/java/facade/AirCirculator.java b/src/main/java/facade/AirCirculator.java new file mode 100644 index 0000000..b4a71ce --- /dev/null +++ b/src/main/java/facade/AirCirculator.java @@ -0,0 +1,14 @@ +package facade; + +public class AirCirculator { + private AirMeter airMeter = new AirMeter(); + + public void takeAir() { + airMeter.getMeasurements(); + System.out.println("Air Circulator take air"); + } + + public void off() { + System.out.println("Air Circulator off"); + } +} diff --git a/src/main/java/facade/AirMeter.java b/src/main/java/facade/AirMeter.java new file mode 100644 index 0000000..c37a89d --- /dev/null +++ b/src/main/java/facade/AirMeter.java @@ -0,0 +1,7 @@ +package facade; + +public class AirMeter { + public void getMeasurements() { + System.out.println("Getting Air Measurements"); + } +} diff --git a/src/main/java/facade/CarEngineFacade.java b/src/main/java/facade/CarEngineFacade.java new file mode 100644 index 0000000..8b32afc --- /dev/null +++ b/src/main/java/facade/CarEngineFacade.java @@ -0,0 +1,22 @@ +package facade; + +public class CarEngineFacade { + private Cooler cooler = new Cooler(); + private AirCirculator airCirculator = new AirCirculator(); + private FuelInjector fuelInjector = new FuelInjector(); + private static final int DEFAULT_MAX_TEMPERATURE = 25; + + public void startEngine() { + airCirculator.takeAir(); + fuelInjector.on(); + cooler.run(); + cooler.cool(DEFAULT_MAX_TEMPERATURE); + fuelInjector.inject(); + } + + public void endEngine() { + airCirculator.off(); + fuelInjector.off(); + cooler.stop(); + } +} diff --git a/src/main/java/facade/Cooler.java b/src/main/java/facade/Cooler.java new file mode 100644 index 0000000..64c3ce2 --- /dev/null +++ b/src/main/java/facade/Cooler.java @@ -0,0 +1,22 @@ +package facade; + +public class Cooler { + private Radiator radiator = new Radiator(); + private TemperatureSensor temperatureSensor = new TemperatureSensor(); + + public void run() { + System.out.println("Air Conditioner in ready"); + radiator.setSpeed(10); + } + + public void cool(int maxAllowedTemperature) { + System.out.println("Cooling maximum : " + maxAllowedTemperature); + temperatureSensor.getTemperature(); + radiator.on(); + } + + public void stop() { + System.out.println("Air Conditioner stop"); + radiator.off(); + } +} diff --git a/src/main/java/facade/FuelInjector.java b/src/main/java/facade/FuelInjector.java new file mode 100644 index 0000000..7e81c97 --- /dev/null +++ b/src/main/java/facade/FuelInjector.java @@ -0,0 +1,17 @@ +package facade; + +public class FuelInjector { + private FuelPump fuelPump = new FuelPump(); + + public void on() { + System.out.println("Fuel Injector in ready"); + } + + public void inject() { + System.out.println("Fuel injected"); + } + + public void off() { + System.out.println("Off Fuel Injector"); + } +} diff --git a/src/main/java/facade/FuelPump.java b/src/main/java/facade/FuelPump.java new file mode 100644 index 0000000..418feca --- /dev/null +++ b/src/main/java/facade/FuelPump.java @@ -0,0 +1,7 @@ +package facade; + +public class FuelPump { + public void pump() { + System.out.println("Pumping fuel"); + } +} diff --git a/src/main/java/facade/Radiator.java b/src/main/java/facade/Radiator.java new file mode 100644 index 0000000..45bc7ee --- /dev/null +++ b/src/main/java/facade/Radiator.java @@ -0,0 +1,15 @@ +package facade; + +public class Radiator { + public void on() { + System.out.println("Radiator switched on!"); + } + + public void off() { + System.out.println("Radiator switched off!"); + } + + public void setSpeed(Integer speed) { + System.out.println(String.format("Setting radiator speed to %d", speed)); + } +} diff --git a/src/main/java/facade/TemperatureSensor.java b/src/main/java/facade/TemperatureSensor.java new file mode 100644 index 0000000..df870a6 --- /dev/null +++ b/src/main/java/facade/TemperatureSensor.java @@ -0,0 +1,7 @@ +package facade; + +public class TemperatureSensor { + public void getTemperature() { + System.out.println("Get Temperature through sensor"); + } +} diff --git a/src/main/java/facade/definition.md b/src/main/java/facade/definition.md new file mode 100644 index 0000000..7687c8b --- /dev/null +++ b/src/main/java/facade/definition.md @@ -0,0 +1,2 @@ +# Facade +한 서브시스템 내의 인터페이스 집합에 대한 획일화된 하나의 인터페이스를 제공해 서브시스템을 사용하기 쉽도록 상위 수준의 인터페이스를 제공한다. \ No newline at end of file diff --git a/src/main/java/mediator/ApplicationMediator.java b/src/main/java/mediator/ApplicationMediator.java new file mode 100644 index 0000000..12d14de --- /dev/null +++ b/src/main/java/mediator/ApplicationMediator.java @@ -0,0 +1,24 @@ +package mediator; + +import java.util.ArrayList; +import java.util.List; + +public class ApplicationMediator implements Mediator { + private List colleagues; + + public ApplicationMediator() { + colleagues = new ArrayList<>(); + } + + public void addColleague(Colleague colleague) { + this.colleagues.add(colleague); + } + + public void send(String message, Colleague colleague) { + for (Colleague c : colleagues) { + if (colleague != c) { + colleague.receive(message); + } + } + } +} diff --git a/src/main/java/mediator/Client.java b/src/main/java/mediator/Client.java new file mode 100644 index 0000000..e03ae04 --- /dev/null +++ b/src/main/java/mediator/Client.java @@ -0,0 +1,15 @@ +package mediator; + +public class Client { + public static void main(String[] args) { + ApplicationMediator mediator = new ApplicationMediator(); + Colleague desktop = new ConcreteColleague(mediator); + Colleague mobile = new MobileColleague(mediator); + + mediator.addColleague(desktop); + mediator.addColleague(mobile); + + desktop.send("Hello World"); + mobile.send("Hello"); + } +} diff --git a/src/main/java/mediator/Colleague.java b/src/main/java/mediator/Colleague.java new file mode 100644 index 0000000..d26e8ee --- /dev/null +++ b/src/main/java/mediator/Colleague.java @@ -0,0 +1,21 @@ +package mediator; + +public abstract class Colleague { + private Mediator mediator; + + public Colleague(Mediator mediator) { + this.mediator = mediator; + } + + //send a message via the mediator + public void send(String message) { + mediator.send(message, this); + } + + //get access to the mediator + public Mediator getMediator() { + return mediator; + } + + public abstract void receive(String message); +} diff --git a/src/main/java/mediator/ConcreteColleague.java b/src/main/java/mediator/ConcreteColleague.java new file mode 100644 index 0000000..3a8e302 --- /dev/null +++ b/src/main/java/mediator/ConcreteColleague.java @@ -0,0 +1,11 @@ +package mediator; + +public class ConcreteColleague extends Colleague { + public ConcreteColleague(Mediator mediator) { + super(mediator); + } + + public void receive(String message) { + System.out.println("Colleague Received : " + message); + } +} diff --git a/src/main/java/mediator/Mediator.java b/src/main/java/mediator/Mediator.java new file mode 100644 index 0000000..7e34fe4 --- /dev/null +++ b/src/main/java/mediator/Mediator.java @@ -0,0 +1,5 @@ +package mediator; + +public interface Mediator { + void send(String message, Colleague colleague); +} diff --git a/src/main/java/mediator/MobileColleague.java b/src/main/java/mediator/MobileColleague.java new file mode 100644 index 0000000..c2513ea --- /dev/null +++ b/src/main/java/mediator/MobileColleague.java @@ -0,0 +1,11 @@ +package mediator; + +public class MobileColleague extends Colleague { + public MobileColleague(Mediator mediator) { + super(mediator); + } + + public void receive(String message) { + System.out.println("Mobile Colleague Received : " + message); + } +} diff --git a/src/main/java/mediator/definition.md b/src/main/java/mediator/definition.md new file mode 100644 index 0000000..fb3d8a1 --- /dev/null +++ b/src/main/java/mediator/definition.md @@ -0,0 +1,6 @@ +![Mediator](./mediator.jpg) + +https://dzone.com/articles/design-patterns-mediator + +>The Mediator defines the interface for communication between Colleague objects. The ConcreteMediator implements the Mediator interface and coordinates communication between Colleague objects. It is aware of all the Colleagues and their purpose with regards to inter communication.The ConcreteColleague communicates with other colleagues through the mediator. + diff --git a/src/main/java/mediator/mediator.jpg b/src/main/java/mediator/mediator.jpg new file mode 100644 index 0000000..9659589 Binary files /dev/null and b/src/main/java/mediator/mediator.jpg differ diff --git a/src/main/java/nullobject/definition.md b/src/main/java/nullobject/definition.md new file mode 100644 index 0000000..ef76957 --- /dev/null +++ b/src/main/java/nullobject/definition.md @@ -0,0 +1,4 @@ +![null](./nullobject.jpg) + + + diff --git a/src/main/java/nullobject/nullobject.jpg b/src/main/java/nullobject/nullobject.jpg new file mode 100644 index 0000000..85495a1 Binary files /dev/null and b/src/main/java/nullobject/nullobject.jpg differ diff --git a/src/main/java/observer/Client.java b/src/main/java/observer/Client.java new file mode 100644 index 0000000..11d2da4 --- /dev/null +++ b/src/main/java/observer/Client.java @@ -0,0 +1,17 @@ +package observer; + +public class Client { + public static void main(String[] args) { + Subject subject = new ConcreteSubject(); + Observer observerA = new ConcreteObserverA(); + Observer observerB = new ConcreteObserverB(); + + subject.notifyObservers("No Listeners"); + + subject.registerObserver(observerA); + subject.notifyObservers("Message for A"); + + subject.registerObserver(observerB); + subject.notifyObservers("Message for A & B"); + } +} diff --git a/src/main/java/observer/ConcreteObserverA.java b/src/main/java/observer/ConcreteObserverA.java new file mode 100644 index 0000000..80c19a7 --- /dev/null +++ b/src/main/java/observer/ConcreteObserverA.java @@ -0,0 +1,7 @@ +package observer; + +public class ConcreteObserverA implements Observer { + public void observe(String event) { + System.out.println("Observer A :" + event); + } +} diff --git a/src/main/java/observer/ConcreteObserverB.java b/src/main/java/observer/ConcreteObserverB.java new file mode 100644 index 0000000..dcd99db --- /dev/null +++ b/src/main/java/observer/ConcreteObserverB.java @@ -0,0 +1,7 @@ +package observer; + +public class ConcreteObserverB implements Observer { + public void observe(String event) { + System.out.println("Observer B :" + event); + } +} diff --git a/src/main/java/observer/ConcreteSubject.java b/src/main/java/observer/ConcreteSubject.java new file mode 100644 index 0000000..9b8bb65 --- /dev/null +++ b/src/main/java/observer/ConcreteSubject.java @@ -0,0 +1,23 @@ +package observer; + +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; + +public class ConcreteSubject implements Subject { + private final Set> observers = new CopyOnWriteArraySet<>(); + + @Override + public void registerObserver(Observer observer) { + observers.add(observer); + } + + @Override + public void unregisterObserver(Observer observer) { + observers.remove(observer); + } + + @Override + public void notifyObservers(String event) { + observers.forEach(ob -> ob.observe(event)); + } +} diff --git a/src/main/java/observer/Observer.java b/src/main/java/observer/Observer.java new file mode 100644 index 0000000..261d398 --- /dev/null +++ b/src/main/java/observer/Observer.java @@ -0,0 +1,5 @@ +package observer; + +public interface Observer { + void observe(T event); +} diff --git a/src/main/java/observer/Subject.java b/src/main/java/observer/Subject.java new file mode 100644 index 0000000..7d38893 --- /dev/null +++ b/src/main/java/observer/Subject.java @@ -0,0 +1,7 @@ +package observer; + +public interface Subject { + void registerObserver(Observer observer); + void unregisterObserver(Observer observer); + void notifyObservers(T event); +} diff --git a/src/main/java/observer/after/ClockObserver.java b/src/main/java/observer/after/ClockObserver.java new file mode 100644 index 0000000..e9b5921 --- /dev/null +++ b/src/main/java/observer/after/ClockObserver.java @@ -0,0 +1,5 @@ +package observer.after; + +public interface ClockObserver { + void update(int hours, int minutes, int seconds); +} diff --git a/src/main/java/observer/after/MockTimeSource.java b/src/main/java/observer/after/MockTimeSource.java new file mode 100644 index 0000000..33db93e --- /dev/null +++ b/src/main/java/observer/after/MockTimeSource.java @@ -0,0 +1,7 @@ +package observer.after; + +public class MockTimeSource extends TimeSource { + public void setTime(int hours, int minutes, int seconds) { + notify(hours, minutes, seconds); + } +} diff --git a/src/main/java/observer/after/TimeSource.java b/src/main/java/observer/after/TimeSource.java new file mode 100644 index 0000000..557bb11 --- /dev/null +++ b/src/main/java/observer/after/TimeSource.java @@ -0,0 +1,20 @@ +package observer.after; + +import java.util.Iterator; +import java.util.Vector; + +public class TimeSource { + private Vector itsObservers = new Vector(); + + protected void notify(int hours, int minutes, int seconds) { + Iterator i = itsObservers.iterator(); + while (i.hasNext()) { + ClockObserver observer = (ClockObserver) i.next(); + observer.update(hours, minutes, seconds); + } + } + + public void registerObserver(ClockObserver observer) { + itsObservers.add(observer); + } +} diff --git a/src/main/java/observer/before/ClockDriver.java b/src/main/java/observer/before/ClockDriver.java new file mode 100644 index 0000000..f3e572d --- /dev/null +++ b/src/main/java/observer/before/ClockDriver.java @@ -0,0 +1,14 @@ +package observer.before; + +public class ClockDriver { + private TimeSink itsSink; + + public ClockDriver(TimeSource source, TimeSink sink) { + source.setDriver(this); + itsSink = sink; + } + + public void update(int hours, int minutes, int seconds) { + itsSink.setTime(hours, minutes, seconds); + } +} diff --git a/src/main/java/observer/before/MockTimeSink.java b/src/main/java/observer/before/MockTimeSink.java new file mode 100644 index 0000000..7c84062 --- /dev/null +++ b/src/main/java/observer/before/MockTimeSink.java @@ -0,0 +1,26 @@ +package observer.before; + +public class MockTimeSink implements TimeSink { + private int itsHours; + private int itsMinutes; + private int itsSeconds; + + public int getItsHours() { + return itsHours; + } + + public int getItsMinutes() { + return itsMinutes; + } + + public int getItsSeconds() { + return itsSeconds; + } + + public void setTime(int hours, int minutes, int seconds) { + this.itsHours = hours; + this.itsMinutes = minutes; + this.itsSeconds = seconds; + } + +} diff --git a/src/main/java/observer/before/MockTimeSource.java b/src/main/java/observer/before/MockTimeSource.java new file mode 100644 index 0000000..6ba9ef6 --- /dev/null +++ b/src/main/java/observer/before/MockTimeSource.java @@ -0,0 +1,13 @@ +package observer.before; + +public class MockTimeSource implements TimeSource { + private ClockDriver itsDriver; + + public void setTime(int hours, int minutes, int seconds) { + itsDriver.update(hours, minutes, seconds); + } + + public void setDriver(ClockDriver driver) { + itsDriver = driver; + } +} diff --git a/src/main/java/observer/before/TimeSink.java b/src/main/java/observer/before/TimeSink.java new file mode 100644 index 0000000..aa24979 --- /dev/null +++ b/src/main/java/observer/before/TimeSink.java @@ -0,0 +1,5 @@ +package observer.before; + +public interface TimeSink { + public void setTime(int hours, int minutes, int seconds); +} diff --git a/src/main/java/observer/before/TimeSource.java b/src/main/java/observer/before/TimeSource.java new file mode 100644 index 0000000..52036d7 --- /dev/null +++ b/src/main/java/observer/before/TimeSource.java @@ -0,0 +1,5 @@ +package observer.before; + +public interface TimeSource { + public void setDriver(ClockDriver driver); +} \ No newline at end of file diff --git a/src/main/java/observer/definition.md b/src/main/java/observer/definition.md new file mode 100644 index 0000000..646b092 --- /dev/null +++ b/src/main/java/observer/definition.md @@ -0,0 +1,4 @@ +# Observer Pattern +관찰자라고 불리는 자손의 리스트르르 가지고 있는 주체(Subject)를 필요로 한다. 주체는 일반적으로 자신의 메서드 중 하나를 호출해 관찰자에게 상태 변경을 알린다. 이 패턴은 이벤트 처리 기반으로 시스템을 구현할 때 필수적이다. + +일반적인 관찰자 패턴은 서브젝트와 옵저버 2개의 인터페이스로 구성된다. 관찰자는 주체에 등록되고 서브젝트로부터 알림을 수신한다. 서브젝트 스스로 이벤트를 발생시키거나 다른 구성 요소에 의해 호출될 수 있다. \ No newline at end of file diff --git a/src/main/java/observer/finish/Client.java b/src/main/java/observer/finish/Client.java new file mode 100644 index 0000000..70c7092 --- /dev/null +++ b/src/main/java/observer/finish/Client.java @@ -0,0 +1,24 @@ +package observer.finish; + + +public class Client { + private MockTimeSource source; + private MockTimeSink sink; + private MockTimeSink2 sink2; + + public void setup() { + source = new MockTimeSource(); + sink = new MockTimeSink(); + sink2 = new MockTimeSink2(); + source.registerObserver(sink); + source.registerObserver(sink2); + + + } + + public void testTimeChange() { + source.setTime(1,2,3); + source.setTime(3, 4, 5); + source.setTime(7, 8, 9); + } +} diff --git a/src/main/java/observer/finish/Main.java b/src/main/java/observer/finish/Main.java new file mode 100644 index 0000000..2163737 --- /dev/null +++ b/src/main/java/observer/finish/Main.java @@ -0,0 +1,9 @@ +package observer.finish; + +public class Main { + public static void main(String[] args) { + Client client = new Client(); + client.setup(); + client.testTimeChange(); + } +} diff --git a/src/main/java/observer/finish/MockTimeSink.java b/src/main/java/observer/finish/MockTimeSink.java new file mode 100644 index 0000000..03d179b --- /dev/null +++ b/src/main/java/observer/finish/MockTimeSink.java @@ -0,0 +1,32 @@ +package observer.finish; + +public class MockTimeSink implements Observer { + private int hours; + private int minutes; + private int seconds; + + public int getHours() { + return hours; + } + + public int getMinutes() { + return minutes; + } + + public int getSeconds() { + return seconds; + } + + public void update(TimeSource source) { + this.hours = source.getHours(); + this.minutes = source.getMinutes(); + this.seconds = source.getSeconds(); + System.out.printf( + "Hours : %d, Minutes : %d, Seconds : %d\n", + this.hours, + this.minutes, + this.seconds); + +// System.out.println(this); + } +} diff --git a/src/main/java/observer/finish/MockTimeSink2.java b/src/main/java/observer/finish/MockTimeSink2.java new file mode 100644 index 0000000..0a5bdf0 --- /dev/null +++ b/src/main/java/observer/finish/MockTimeSink2.java @@ -0,0 +1,32 @@ +package observer.finish; + +public class MockTimeSink2 implements Observer { + private int hours; + private int minutes; + private int seconds; + + public int getHours() { + return hours; + } + + public int getMinutes() { + return minutes; + } + + public int getSeconds() { + return seconds; + } + + public void update(TimeSource source) { + this.hours = source.getHours(); + this.minutes = source.getMinutes(); + this.seconds = source.getSeconds(); + System.out.printf( + "** Hours : %d, Minutes : %d, Seconds : %d **\n", + this.hours, + this.minutes, + this.seconds); + +// System.out.println(this); + } +} diff --git a/src/main/java/observer/finish/MockTimeSource.java b/src/main/java/observer/finish/MockTimeSource.java new file mode 100644 index 0000000..1d6f66f --- /dev/null +++ b/src/main/java/observer/finish/MockTimeSource.java @@ -0,0 +1,29 @@ +package observer.finish; + +public class MockTimeSource extends Subject implements TimeSource { + private int hours; + private int minutes; + private int seconds; + + public void setTime(int hours, int minutes, int seconds) { + this.hours = hours; + this.minutes = minutes; + this.seconds = seconds; + notifyObserver(this); + } + + @Override + public int getHours() { + return hours; + } + + @Override + public int getMinutes() { + return minutes; + } + + @Override + public int getSeconds() { + return seconds; + } +} diff --git a/src/main/java/observer/finish/Observer.java b/src/main/java/observer/finish/Observer.java new file mode 100644 index 0000000..704f803 --- /dev/null +++ b/src/main/java/observer/finish/Observer.java @@ -0,0 +1,5 @@ +package observer.finish; + +public interface Observer { + void update(TimeSource timeSource); +} diff --git a/src/main/java/observer/finish/Subject.java b/src/main/java/observer/finish/Subject.java new file mode 100644 index 0000000..4e706b3 --- /dev/null +++ b/src/main/java/observer/finish/Subject.java @@ -0,0 +1,20 @@ +package observer.finish; + +import java.util.Iterator; +import java.util.Vector; + +public class Subject { + private Vector itsObservers = new Vector(); + + protected void notifyObserver(TimeSource source) { + Iterator i = itsObservers.iterator(); + while (i.hasNext()) { + Observer observer = (Observer) i.next(); + observer.update(source); + } + } + + public void registerObserver(Observer observer) { + itsObservers.add(observer); + } +} diff --git a/src/main/java/observer/finish/TimeSource.java b/src/main/java/observer/finish/TimeSource.java new file mode 100644 index 0000000..544e085 --- /dev/null +++ b/src/main/java/observer/finish/TimeSource.java @@ -0,0 +1,7 @@ +package observer.finish; + +public interface TimeSource { + int getHours(); + int getMinutes(); + int getSeconds(); +} diff --git a/src/main/java/observer/process/ClockObserver.java b/src/main/java/observer/process/ClockObserver.java new file mode 100644 index 0000000..6fb8e2f --- /dev/null +++ b/src/main/java/observer/process/ClockObserver.java @@ -0,0 +1,5 @@ +package observer.process; + +public interface ClockObserver { + void update(int hours, int minutes, int seconds); +} diff --git a/src/main/java/observer/process/MockTimeSink.java b/src/main/java/observer/process/MockTimeSink.java new file mode 100644 index 0000000..177de48 --- /dev/null +++ b/src/main/java/observer/process/MockTimeSink.java @@ -0,0 +1,26 @@ +package observer.process; + +public class MockTimeSink implements ClockObserver { + private int itsHours; + private int itsMinutes; + private int itsSeconds; + + public int getItsHours() { + return itsHours; + } + + public int getItsMinutes() { + return itsMinutes; + } + + public int getItsSeconds() { + return itsSeconds; + } + + @Override + public void update(int hours, int minutes, int seconds) { + this.itsHours = hours; + this.itsMinutes = minutes; + this.itsSeconds = seconds; + } +} diff --git a/src/main/java/observer/process/MockTimeSource.java b/src/main/java/observer/process/MockTimeSource.java new file mode 100644 index 0000000..08c1c24 --- /dev/null +++ b/src/main/java/observer/process/MockTimeSource.java @@ -0,0 +1,13 @@ +package observer.process; + +public class MockTimeSource implements TimeSource { + private ClockObserver itsObserver; + + public void setTime(int hours, int minutes, int seconds) { + itsObserver.update(hours, minutes, seconds); + } + + public void setObserver(ClockObserver observer) { + itsObserver = observer; + } +} diff --git a/src/main/java/observer/process/TimeSource.java b/src/main/java/observer/process/TimeSource.java new file mode 100644 index 0000000..5c60631 --- /dev/null +++ b/src/main/java/observer/process/TimeSource.java @@ -0,0 +1,5 @@ +package observer.process; + +public interface TimeSource { + void setObserver(ClockObserver observer); +} \ No newline at end of file diff --git a/src/main/java/singleton/InitializeOnDemandHolder.java b/src/main/java/singleton/InitializeOnDemandHolder.java new file mode 100644 index 0000000..d477048 --- /dev/null +++ b/src/main/java/singleton/InitializeOnDemandHolder.java @@ -0,0 +1,15 @@ +package singleton; + +public class InitializeOnDemandHolder { + private InitializeOnDemandHolder() { + } + + private static class LazyHolder { + static final InitializeOnDemandHolder INSTANCE = new InitializeOnDemandHolder(); + } + + public static InitializeOnDemandHolder getInstance() { + return LazyHolder.INSTANCE; + } + +} diff --git a/src/main/java/singleton/Singleton.java b/src/main/java/singleton/Singleton.java new file mode 100644 index 0000000..12f4413 --- /dev/null +++ b/src/main/java/singleton/Singleton.java @@ -0,0 +1,12 @@ +package singleton; + +public class Singleton { + private static Singleton singleton; + + public synchronized Singleton getInstance() { + if (singleton == null) { + singleton = new Singleton(); + } + return singleton; + } +} diff --git a/src/main/java/strategy/definition.md b/src/main/java/strategy/definition.md new file mode 100644 index 0000000..e8931c2 --- /dev/null +++ b/src/main/java/strategy/definition.md @@ -0,0 +1,6 @@ +# 전략 패턴 +동일 계열의 알고리즘을 정의하고 각 알고리즘을 캡슐화하며 이들을 상호교환이 가능하도록 만든다. 알고리즘을 사용하는 클라이언트와 상관없이 독립적읕로 알고리즘을 다양하게 변경할 수 있게 한다. + +![Strategy](./strategy.jpg) + +실무에서 사용하는 https://dublin-java.tistory.com/38 \ No newline at end of file diff --git a/src/main/java/strategy/strategy.jpg b/src/main/java/strategy/strategy.jpg new file mode 100644 index 0000000..2086afc Binary files /dev/null and b/src/main/java/strategy/strategy.jpg differ diff --git a/src/main/java/templatemethod/README.md b/src/main/java/templatemethod/README.md new file mode 100644 index 0000000..bf36cd6 --- /dev/null +++ b/src/main/java/templatemethod/README.md @@ -0,0 +1,8 @@ +# 템플릿 메소드 패턴 +객체의 연산에는 알고리즘의 뼈대만을 정의하고 각 단계에서 수행할 구체적 처리는 서브클래스 쪽으로 미룹니다. 알고리즘의 구조 자체는 그대로 놔둔 채 알고리즘 각 단계 처리를 서브클래스에서 재정의할 수 있게 합니다. + +![구현된 Motor UML](./template-method.jpg) + +[참고] + https://gmlwjd9405.github.io/2018/07/13/template-method-pattern.html + GOF의 디자인 패턴 \ No newline at end of file diff --git a/src/main/java/templatemethod/motor/Client.java b/src/main/java/templatemethod/motor/Client.java new file mode 100644 index 0000000..ba68ac8 --- /dev/null +++ b/src/main/java/templatemethod/motor/Client.java @@ -0,0 +1,9 @@ +package templatemethod.motor; + +public class Client { + public static void main(String[] args) { + Door door = new Door(); + Motor hyundaiMotor = new HyundaiMotor(door); + hyundaiMotor.move(Direction.DOWN); + } +} diff --git a/src/main/java/templatemethod/motor/Direction.java b/src/main/java/templatemethod/motor/Direction.java new file mode 100644 index 0000000..5263d95 --- /dev/null +++ b/src/main/java/templatemethod/motor/Direction.java @@ -0,0 +1,5 @@ +package templatemethod.motor; + +public enum Direction { + UP, DOWN +} diff --git a/src/main/java/templatemethod/motor/Door.java b/src/main/java/templatemethod/motor/Door.java new file mode 100644 index 0000000..dab73da --- /dev/null +++ b/src/main/java/templatemethod/motor/Door.java @@ -0,0 +1,26 @@ +package templatemethod.motor; + +public class Door { + private DoorStatus doorStatus; + + public Door() { + } + + public DoorStatus getDoorStatus() { + return doorStatus; + } + + public void open() { + this.doorStatus = DoorStatus.OPEN; + } + + public void close() { + this.doorStatus = DoorStatus.CLOSE; + } + + public enum DoorStatus { + OPEN, CLOSE + } +} + + diff --git a/src/main/java/templatemethod/motor/HyundaiMotor.java b/src/main/java/templatemethod/motor/HyundaiMotor.java new file mode 100644 index 0000000..54b80d1 --- /dev/null +++ b/src/main/java/templatemethod/motor/HyundaiMotor.java @@ -0,0 +1,12 @@ +package templatemethod.motor; + +public class HyundaiMotor extends Motor { + public HyundaiMotor(Door door) { + super(door); + } + + @Override + protected void moveMotor(Direction direction) { + System.out.println("Move Hyundai Motor " + direction); + } +} diff --git a/src/main/java/templatemethod/motor/LgMotor.java b/src/main/java/templatemethod/motor/LgMotor.java new file mode 100644 index 0000000..a821bde --- /dev/null +++ b/src/main/java/templatemethod/motor/LgMotor.java @@ -0,0 +1,12 @@ +package templatemethod.motor; + +public class LgMotor extends Motor { + public LgMotor(Door door) { + super(door); + } + + @Override + protected void moveMotor(Direction direction) { + System.out.println("Move LG Motor"); + } +} diff --git a/src/main/java/templatemethod/motor/Motor.java b/src/main/java/templatemethod/motor/Motor.java new file mode 100644 index 0000000..35e09ae --- /dev/null +++ b/src/main/java/templatemethod/motor/Motor.java @@ -0,0 +1,41 @@ +package templatemethod.motor; + +public abstract class Motor { + protected Door door; + private MotorStatus motorStatus; + + public Motor(Door door) { + this.door = door; + this.motorStatus = MotorStatus.STOPPED; + } + + public Door getDoor() { + return door; + } + + public MotorStatus getMotorStatus() { + return motorStatus; + } + + public void setMotorStatus(MotorStatus motorStatus) { + this.motorStatus = motorStatus; + } + + public void move(Direction direction) { + Motor.MotorStatus motorStatus = getMotorStatus(); + if (motorStatus == Motor.MotorStatus.MOVING) return; + + Door.DoorStatus doorStatus = door.getDoorStatus(); + if (doorStatus == Door.DoorStatus.OPEN) door.close(); + + moveMotor(direction); // overriding each class + + setMotorStatus(Motor.MotorStatus.MOVING); + } // template method + + protected abstract void moveMotor(Direction direction); + + public enum MotorStatus { + MOVING, STOPPED + } +} diff --git a/src/main/java/templatemethod/sorter/BubbleSorter.java b/src/main/java/templatemethod/sorter/BubbleSorter.java new file mode 100644 index 0000000..09dab9e --- /dev/null +++ b/src/main/java/templatemethod/sorter/BubbleSorter.java @@ -0,0 +1,26 @@ +package templatemethod.sorter; + +public abstract class BubbleSorter { + private int operations = 0; + protected int length = 0; + + protected int doSort() { + operations = 0; + if (length <= 1) { + return operations; + } + + for (int nextToLast = length - 2; nextToLast >= 0; nextToLast--) { + for (int index = 0; index <= nextToLast; index++) { + if (outOfOrder(index)) { + swap(index); + } + operations++; + } + } + return operations; + } + + protected abstract void swap(int index); + protected abstract boolean outOfOrder(int index); +} diff --git a/src/main/java/templatemethod/sorter/IntBubbleSorter.java b/src/main/java/templatemethod/sorter/IntBubbleSorter.java new file mode 100644 index 0000000..97302dc --- /dev/null +++ b/src/main/java/templatemethod/sorter/IntBubbleSorter.java @@ -0,0 +1,21 @@ +package templatemethod.sorter; + +public class IntBubbleSorter extends BubbleSorter { + private int[] array = null; + + public int sort(int[] theArray) { + array = theArray; + length = array.length; + return doSort(); + } + + protected void swap(int index) { + int temp = array[index]; + array[index] = array[index + 1]; + array[index + 1] = temp; + } + + protected boolean outOfOrder(int index) { + return (array[index] > array[index + 1]); + } +} diff --git a/src/main/java/templatemethod/template-method.jpg b/src/main/java/templatemethod/template-method.jpg new file mode 100644 index 0000000..95f7583 Binary files /dev/null and b/src/main/java/templatemethod/template-method.jpg differ diff --git a/src/test/java/DeduserTest.java b/src/test/java/DeduserTest.java new file mode 100644 index 0000000..f0cfd78 --- /dev/null +++ b/src/test/java/DeduserTest.java @@ -0,0 +1,14 @@ +import adapter.DedicatedModem; +import adapter.DedicatedModemAdapter; +import org.junit.jupiter.api.Test; + +class DeduserTest { + @Test + public void test() { + new DedicatedModemAdapter(new DedicatedModem()).send(); + + + } + + +} \ No newline at end of file