diff --git a/chapter1/byeonggon/design_puzzle/behavior/AxeBehavior.java b/chapter1/byeonggon/design_puzzle/behavior/AxeBehavior.java deleted file mode 100644 index aeae884..0000000 --- a/chapter1/byeonggon/design_puzzle/behavior/AxeBehavior.java +++ /dev/null @@ -1,8 +0,0 @@ -package chapter1.behavior; - -public class AxeBehavior implements WeaponBehavior{ - @Override - public void useWeapon() { - System.out.println("도끼로 찍다."); - } -} diff --git a/chapter1/byeonggon/design_puzzle/behavior/BowAndArrowBehavior.java b/chapter1/byeonggon/design_puzzle/behavior/BowAndArrowBehavior.java deleted file mode 100644 index e67127c..0000000 --- a/chapter1/byeonggon/design_puzzle/behavior/BowAndArrowBehavior.java +++ /dev/null @@ -1,8 +0,0 @@ -package chapter1.behavior; - -public class BowAndArrowBehavior implements WeaponBehavior{ - @Override - public void useWeapon() { - System.out.println("화살을 쏜다."); - } -} diff --git a/chapter1/byeonggon/design_puzzle/behavior/KnifeBehavior.java b/chapter1/byeonggon/design_puzzle/behavior/KnifeBehavior.java deleted file mode 100644 index b1fb669..0000000 --- a/chapter1/byeonggon/design_puzzle/behavior/KnifeBehavior.java +++ /dev/null @@ -1,9 +0,0 @@ -package chapter1.behavior; - -public class KnifeBehavior implements WeaponBehavior{ - - @Override - public void useWeapon() { - System.out.println("칼로 벤다"); - } -} diff --git a/chapter1/byeonggon/design_puzzle/behavior/SwordBehavior.java b/chapter1/byeonggon/design_puzzle/behavior/SwordBehavior.java deleted file mode 100644 index e2a392d..0000000 --- a/chapter1/byeonggon/design_puzzle/behavior/SwordBehavior.java +++ /dev/null @@ -1,8 +0,0 @@ -package chapter1.behavior; - -public class SwordBehavior implements WeaponBehavior{ - @Override - public void useWeapon() { - System.out.println("검을 휘두르다."); - } -} diff --git a/chapter1/byeonggon/design_puzzle/character/Character.java b/chapter1/byeonggon/design_puzzle/character/Character.java deleted file mode 100644 index 6a609d9..0000000 --- a/chapter1/byeonggon/design_puzzle/character/Character.java +++ /dev/null @@ -1,13 +0,0 @@ -package chapter1.character; - -import chapter1.behavior.WeaponBehavior; - -public abstract class Character { - WeaponBehavior weapon; - - abstract public void fight(); - - public void setWeapon(WeaponBehavior w){ - this.weapon = w; - } -} diff --git a/chapter1/byeonggon/design_puzzle/character/King.java b/chapter1/byeonggon/design_puzzle/character/King.java deleted file mode 100644 index f32ef7f..0000000 --- a/chapter1/byeonggon/design_puzzle/character/King.java +++ /dev/null @@ -1,9 +0,0 @@ -package chapter1.character; - -public class King extends Character{ - @Override - public void fight() { - System.out.println("왕이"); - weapon.useWeapon(); - } -} diff --git a/chapter1/byeonggon/design_puzzle/character/Knight.java b/chapter1/byeonggon/design_puzzle/character/Knight.java deleted file mode 100644 index cb5c0c0..0000000 --- a/chapter1/byeonggon/design_puzzle/character/Knight.java +++ /dev/null @@ -1,11 +0,0 @@ -package chapter1.character; - -public class Knight extends Character{ - - - @Override - public void fight() { - System.out.println("나이트가"); - weapon.useWeapon(); - } -} diff --git a/chapter1/byeonggon/design_puzzle/character/Queen.java b/chapter1/byeonggon/design_puzzle/character/Queen.java deleted file mode 100644 index 4997696..0000000 --- a/chapter1/byeonggon/design_puzzle/character/Queen.java +++ /dev/null @@ -1,13 +0,0 @@ -package chapter1.character; - -import chapter1.behavior.WeaponBehavior; - -public class Queen extends Character{ - - @Override - public void fight() { - - System.out.println("여왕이"); - weapon.useWeapon(); - } -} diff --git a/chapter1/byeonggon/design_puzzle/character/Troll.java b/chapter1/byeonggon/design_puzzle/character/Troll.java deleted file mode 100644 index 19b6ffc..0000000 --- a/chapter1/byeonggon/design_puzzle/character/Troll.java +++ /dev/null @@ -1,9 +0,0 @@ -package chapter1.character; - -public class Troll extends Character{ - @Override - public void fight() { - System.out.println("트롤이"); - weapon.useWeapon(); - } -} diff --git a/chapter1/seungwon/strategyPattern/ActionAdventureSimulator.java b/chapter1/seungwon/strategyPattern/ActionAdventureSimulator.java new file mode 100644 index 0000000..f2eca7b --- /dev/null +++ b/chapter1/seungwon/strategyPattern/ActionAdventureSimulator.java @@ -0,0 +1,13 @@ +import behavior.AxeBehavior; +import character.Character; +import character.Queen; + +public class ActionAdventureSimulator { + public static void main(String[] args) { + Character userCharacter = new Queen(); + userCharacter.fight(); + + userCharacter.setWeapon(new AxeBehavior()); + userCharacter.fight(); + } +} diff --git a/chapter1/seungwon/strategyPattern/behavior/AxeBehavior.java b/chapter1/seungwon/strategyPattern/behavior/AxeBehavior.java new file mode 100644 index 0000000..7030542 --- /dev/null +++ b/chapter1/seungwon/strategyPattern/behavior/AxeBehavior.java @@ -0,0 +1,8 @@ +package behavior; + +public class AxeBehavior implements WeaponBehavior { + @Override + public void useWeapon() { + System.out.println("공격 - 도끼로 찍어버리기"); + } +} \ No newline at end of file diff --git a/chapter1/seungwon/strategyPattern/behavior/BowAndArrowBehavior.java b/chapter1/seungwon/strategyPattern/behavior/BowAndArrowBehavior.java new file mode 100644 index 0000000..4fc70e8 --- /dev/null +++ b/chapter1/seungwon/strategyPattern/behavior/BowAndArrowBehavior.java @@ -0,0 +1,8 @@ +package behavior; + +public class BowAndArrowBehavior implements WeaponBehavior { + @Override + public void useWeapon() { + System.out.println("공격 - 화살쏘기"); + } +} \ No newline at end of file diff --git a/chapter1/seungwon/strategyPattern/behavior/KnifeBehavior.java b/chapter1/seungwon/strategyPattern/behavior/KnifeBehavior.java new file mode 100644 index 0000000..ba58333 --- /dev/null +++ b/chapter1/seungwon/strategyPattern/behavior/KnifeBehavior.java @@ -0,0 +1,8 @@ +package behavior; + +public class KnifeBehavior implements WeaponBehavior { + @Override + public void useWeapon() { + System.out.println("공격 - 칼로 베기"); + } +} \ No newline at end of file diff --git a/chapter1/seungwon/strategyPattern/behavior/SwordBehavior.java b/chapter1/seungwon/strategyPattern/behavior/SwordBehavior.java new file mode 100644 index 0000000..c3cd976 --- /dev/null +++ b/chapter1/seungwon/strategyPattern/behavior/SwordBehavior.java @@ -0,0 +1,8 @@ +package behavior; + +public class SwordBehavior implements WeaponBehavior { + @Override + public void useWeapon() { + System.out.println("공격 - 검 휘두르기!"); + } +} \ No newline at end of file diff --git a/chapter1/byeonggon/design_puzzle/behavior/WeaponBehavior.java b/chapter1/seungwon/strategyPattern/behavior/WeaponBehavior.java similarity index 66% rename from chapter1/byeonggon/design_puzzle/behavior/WeaponBehavior.java rename to chapter1/seungwon/strategyPattern/behavior/WeaponBehavior.java index 97df348..47200cc 100644 --- a/chapter1/byeonggon/design_puzzle/behavior/WeaponBehavior.java +++ b/chapter1/seungwon/strategyPattern/behavior/WeaponBehavior.java @@ -1,5 +1,5 @@ -package chapter1.behavior; +package behavior; public interface WeaponBehavior { void useWeapon(); -} +} \ No newline at end of file diff --git a/chapter1/seungwon/strategyPattern/character/Character.java b/chapter1/seungwon/strategyPattern/character/Character.java new file mode 100644 index 0000000..c15f064 --- /dev/null +++ b/chapter1/seungwon/strategyPattern/character/Character.java @@ -0,0 +1,14 @@ +package character; + +import behavior.WeaponBehavior; + +public abstract class Character { + WeaponBehavior weapon; + + public abstract void fight(); + + public void setWeapon(WeaponBehavior w) { + this.weapon = w; + } + +} \ No newline at end of file diff --git a/chapter1/seungwon/strategyPattern/character/King.java b/chapter1/seungwon/strategyPattern/character/King.java new file mode 100644 index 0000000..2a167f5 --- /dev/null +++ b/chapter1/seungwon/strategyPattern/character/King.java @@ -0,0 +1,14 @@ +package character; + +import behavior.KnifeBehavior; + +public class King extends Character { + public King(){ + setWeapon(new KnifeBehavior()); + } + @Override + public void fight() { + System.out.println("공격 개시 - King"); + weapon.useWeapon(); + } +} \ No newline at end of file diff --git a/chapter1/seungwon/strategyPattern/character/Knight.java b/chapter1/seungwon/strategyPattern/character/Knight.java new file mode 100644 index 0000000..48f5e85 --- /dev/null +++ b/chapter1/seungwon/strategyPattern/character/Knight.java @@ -0,0 +1,14 @@ +package character; + +import behavior.SwordBehavior; + +public class Knight extends Character { + public Knight(){ + setWeapon(new SwordBehavior()); + } + @Override + public void fight() { + System.out.println("공격 개시 - Knight"); + weapon.useWeapon(); + } +} \ No newline at end of file diff --git a/chapter1/seungwon/strategyPattern/character/Queen.java b/chapter1/seungwon/strategyPattern/character/Queen.java new file mode 100644 index 0000000..80b2328 --- /dev/null +++ b/chapter1/seungwon/strategyPattern/character/Queen.java @@ -0,0 +1,14 @@ +package character; + +import behavior.BowAndArrowBehavior; + +public class Queen extends Character { + public Queen(){ + setWeapon(new BowAndArrowBehavior()); + } + @Override + public void fight() { + System.out.println("공격 개시 - Queen"); + weapon.useWeapon(); + } +} \ No newline at end of file diff --git a/chapter1/seungwon/strategyPattern/character/Troll.java b/chapter1/seungwon/strategyPattern/character/Troll.java new file mode 100644 index 0000000..068d2f2 --- /dev/null +++ b/chapter1/seungwon/strategyPattern/character/Troll.java @@ -0,0 +1,14 @@ +package character; + +import behavior.AxeBehavior; + +public class Troll extends Character { + public Troll(){ + setWeapon(new AxeBehavior()); + } + @Override + public void fight() { + System.out.println("공격 개시 - Troll"); + weapon.useWeapon(); + } +} \ No newline at end of file diff --git a/chapter2/seungwon/observerPattern/Observer/Observer.java b/chapter2/seungwon/observerPattern/Observer/Observer.java new file mode 100644 index 0000000..a95b254 --- /dev/null +++ b/chapter2/seungwon/observerPattern/Observer/Observer.java @@ -0,0 +1,5 @@ +package tmp.observerPattern; + +public interface Observer { + public void update(); +} diff --git a/chapter2/seungwon/observerPattern/Observer/Subsribers.java b/chapter2/seungwon/observerPattern/Observer/Subsribers.java new file mode 100644 index 0000000..ce4edf8 --- /dev/null +++ b/chapter2/seungwon/observerPattern/Observer/Subsribers.java @@ -0,0 +1,27 @@ +package tmp.observerPattern; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Subsribers implements Observer { + private final String name; + private final List subscribingCompanies = new ArrayList<>(); + private final Map dailyQuoteByCompany = new HashMap(); + + public Subsribers(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public void update() { + for(StockCompany company:subscribingCompanies){ + dailyQuoteByCompany.put(company.code, company.getDailyQuote()); + } + } +} diff --git a/chapter2/seungwon/observerPattern/Subject/StockCompany.java b/chapter2/seungwon/observerPattern/Subject/StockCompany.java new file mode 100644 index 0000000..6fa395a --- /dev/null +++ b/chapter2/seungwon/observerPattern/Subject/StockCompany.java @@ -0,0 +1,41 @@ +package tmp.observerPattern; + +import java.util.ArrayList; +import java.util.List; + +public class StockCompany implements Subject { + public final String code; + private final List dailyQuotes = new ArrayList<>(); + private final List observers = new ArrayList<>(); + + public StockCompany(String code) { + this.code = code; + } + + @Override + public void notifyObservers() { + for (Observer observer : observers) { + observer.update(); + } + } + + @Override + public void registerObserver(Observer observer) { + observers.add(observer); + } + + @Override + public void removeObserver(Observer observer) { + observers.remove(observer); + } + + public Double getDailyQuote() { + int recentIdx = dailyQuotes.size() - 1; + return dailyQuotes.get(recentIdx); + } + + public void updateDailyQuote(Double dailyQuote) { + dailyQuotes.add(dailyQuote); + notifyObservers(); + } +} diff --git a/chapter2/seungwon/observerPattern/Subject/Subject.java b/chapter2/seungwon/observerPattern/Subject/Subject.java new file mode 100644 index 0000000..25a49ad --- /dev/null +++ b/chapter2/seungwon/observerPattern/Subject/Subject.java @@ -0,0 +1,9 @@ +package tmp.observerPattern; + +public interface Subject { + void notifyObservers(); + + void registerObserver(Observer observer); + + void removeObserver(Observer observer); +} diff --git a/chapter3/seungwon/decoratorPattern/DataProcessor.java b/chapter3/seungwon/decoratorPattern/DataProcessor.java new file mode 100644 index 0000000..9bae10b --- /dev/null +++ b/chapter3/seungwon/decoratorPattern/DataProcessor.java @@ -0,0 +1,9 @@ +package tmp.decoratorPattern; + +public interface DataProcessor { + String getData(); + + void setData(String data); + + void process(); +} diff --git a/chapter3/seungwon/decoratorPattern/Decryptor.java b/chapter3/seungwon/decoratorPattern/Decryptor.java new file mode 100644 index 0000000..1d97232 --- /dev/null +++ b/chapter3/seungwon/decoratorPattern/Decryptor.java @@ -0,0 +1,34 @@ +package tmp.decoratorPattern; + +public class Decryptor implements DataProcessor { + private final DataProcessor dataProcessor; + + public Decryptor(DataProcessor dataProcessor) { + this.dataProcessor = dataProcessor; + } + + @Override + public void process() { + dataProcessor.process(); + decryptData(); + } + + private void decryptData() { + String data = dataProcessor.getData(); + StringBuilder decryptedData = new StringBuilder(); + for (int i = data.length() - 1; i >= 0; i--) { + decryptedData.append(data.charAt(i)); + } + dataProcessor.setData(decryptedData.toString()); + } + + @Override + public String getData() { + return dataProcessor.getData(); + } + + @Override + public void setData(String data) { + dataProcessor.setData(data); + } +} diff --git a/chapter3/seungwon/decoratorPattern/Encryptor.java b/chapter3/seungwon/decoratorPattern/Encryptor.java new file mode 100644 index 0000000..3556816 --- /dev/null +++ b/chapter3/seungwon/decoratorPattern/Encryptor.java @@ -0,0 +1,34 @@ +package tmp.decoratorPattern; + +public class Encryptor implements DataProcessor { + private final DataProcessor dataProcessor; + + public Encryptor(DataProcessor dataProcessor) { + this.dataProcessor = dataProcessor; + } + + @Override + public void process() { + dataProcessor.process(); + encryptData(); + } + + private void encryptData() { + String data = dataProcessor.getData(); + StringBuilder encryptedData = new StringBuilder(); + for (int i = data.length() - 1; i >= 0; i--) { + encryptedData.append(data.charAt(i)); + } + dataProcessor.setData(encryptedData.toString()); + } + + @Override + public String getData() { + return dataProcessor.getData(); + } + + @Override + public void setData(String data) { + dataProcessor.setData(data); + } +} diff --git a/chapter3/seungwon/decoratorPattern/InputProcessor.java b/chapter3/seungwon/decoratorPattern/InputProcessor.java new file mode 100644 index 0000000..e629f45 --- /dev/null +++ b/chapter3/seungwon/decoratorPattern/InputProcessor.java @@ -0,0 +1,32 @@ +package tmp.decoratorPattern; + +import java.util.Scanner; + +public class InputProcessor implements DataProcessor { + private final Scanner SCANNER = new Scanner(System.in); + private final String DELIMITER = "|"; + private String data; + + @Override + public void process() { + System.out.print("이름을 입력하세요: "); + String name = SCANNER.next(); + System.out.print("전화번호를 입력하세요: "); + String phoneNumber = SCANNER.next(); + System.out.print("주소를 입력하세요: "); + String address = SCANNER.next(); + + data = name + DELIMITER + phoneNumber + DELIMITER + address; + SCANNER.close(); + } + + @Override + public String getData() { + return data; + } + + @Override + public void setData(String data) { + this.data = data; + } +} diff --git a/chapter3/seungwon/decoratorPattern/Main.java b/chapter3/seungwon/decoratorPattern/Main.java new file mode 100644 index 0000000..030fd95 --- /dev/null +++ b/chapter3/seungwon/decoratorPattern/Main.java @@ -0,0 +1,12 @@ +package tmp.decoratorPattern; + +import java.io.IOException; + +public class Main { + public static void main(String[] args) throws IOException { + DataProcessor dataProcessor = new OutputProcessor( + new Decryptor(new OutputProcessor(new Saver(new Encryptor(new Validator(new InputProcessor())))))); + + dataProcessor.process(); + } +} diff --git a/chapter3/seungwon/decoratorPattern/OutputProcessor.java b/chapter3/seungwon/decoratorPattern/OutputProcessor.java new file mode 100644 index 0000000..3f629ef --- /dev/null +++ b/chapter3/seungwon/decoratorPattern/OutputProcessor.java @@ -0,0 +1,25 @@ +package tmp.decoratorPattern; + +public class OutputProcessor implements DataProcessor { + private final DataProcessor dataProcessor; + + public OutputProcessor(DataProcessor dataProcessor) { + this.dataProcessor = dataProcessor; + } + + @Override + public String getData() { + return dataProcessor.getData(); + } + + @Override + public void setData(String data) { + dataProcessor.setData(data); + } + + @Override + public void process() { + dataProcessor.process(); + System.out.println(">> 데이터 : " + dataProcessor.getData()); + } +} diff --git a/chapter3/seungwon/decoratorPattern/Saver.java b/chapter3/seungwon/decoratorPattern/Saver.java new file mode 100644 index 0000000..17c0fb4 --- /dev/null +++ b/chapter3/seungwon/decoratorPattern/Saver.java @@ -0,0 +1,26 @@ +package tmp.decoratorPattern; + +public class Saver implements DataProcessor { + private final DataProcessor dataProcessor; + private String data; + + public Saver(DataProcessor dataProcessor) { + this.dataProcessor = dataProcessor; + } + + @Override + public String getData() { + return data; + } + + @Override + public void setData(String data) { + this.data = data; + } + + @Override + public void process() { + dataProcessor.process(); + setData(dataProcessor.getData()); + } +} diff --git a/chapter3/seungwon/decoratorPattern/Validator.java b/chapter3/seungwon/decoratorPattern/Validator.java new file mode 100644 index 0000000..ca38acd --- /dev/null +++ b/chapter3/seungwon/decoratorPattern/Validator.java @@ -0,0 +1,33 @@ +package tmp.decoratorPattern; + +public class Validator implements DataProcessor { + private final DataProcessor dataProcessor; + + public Validator(DataProcessor dataProcessor) { + this.dataProcessor = dataProcessor; + } + + @Override + public void process() { + dataProcessor.process(); + validateData(); + } + + private void validateData() { + if (dataProcessor.getData().isEmpty() || dataProcessor.getData().isBlank()) { + System.out.println("데이터가 유효하지 않습니다."); + } else { + System.out.println("데이터가 유효합니다."); + } + } + + @Override + public String getData() { + return dataProcessor.getData(); + } + + @Override + public void setData(String data) { + dataProcessor.setData(data); + } +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/Application.java b/chapter4,5/seungwon/abstractFactoryPattern/Application.java new file mode 100644 index 0000000..abe642a --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/Application.java @@ -0,0 +1,21 @@ +package tmp.abstractFactory; + +import tmp.abstractFactory.button.Button; +import tmp.abstractFactory.factory.GUIFactory; + +class Application { + private final GUIFactory factory; + private Button button; + + public Application(GUIFactory factory) { + this.factory = factory; + } + + public void createUI() { + this.button = factory.createButton(); + } + + public void paint() { + button.paint(); + } +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/ApplicationConfigurator.java b/chapter4,5/seungwon/abstractFactoryPattern/ApplicationConfigurator.java new file mode 100644 index 0000000..809f4b9 --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/ApplicationConfigurator.java @@ -0,0 +1,29 @@ +package tmp.abstractFactory; + +import tmp.abstractFactory.factory.GUIFactory; +import tmp.abstractFactory.factory.MacFactory; +import tmp.abstractFactory.factory.WinFactory; + +public class ApplicationConfigurator { + public static void main(String[] args) throws Exception { + String operatingSystem = readApplicationConfigFile(); + + GUIFactory factory; + + if (operatingSystem.equals("Windows")) { + factory = WinFactory.getInstance(); + } else if (operatingSystem.equals("Mac")) { + factory = MacFactory.getInstance(); + } else { + throw new Exception("Error! Unknown operating system."); + } + + Application app = new Application(factory); + app.createUI(); + app.paint(); + } + + private static String readApplicationConfigFile() { + return "Windows"; + } +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/button/Button.java b/chapter4,5/seungwon/abstractFactoryPattern/button/Button.java new file mode 100644 index 0000000..9ab13e7 --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/button/Button.java @@ -0,0 +1,5 @@ +package tmp.abstractFactory.button; + +public interface Button { + void paint(); +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/button/MacButton.java b/chapter4,5/seungwon/abstractFactoryPattern/button/MacButton.java new file mode 100644 index 0000000..ef13848 --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/button/MacButton.java @@ -0,0 +1,7 @@ +package tmp.abstractFactory.button; + +public class MacButton implements Button { + public void paint() { + System.out.println("Rendering a button in Mac style."); + } +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/button/WinButton.java b/chapter4,5/seungwon/abstractFactoryPattern/button/WinButton.java new file mode 100644 index 0000000..3d7ca18 --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/button/WinButton.java @@ -0,0 +1,7 @@ +package tmp.abstractFactory.button; + +public class WinButton implements Button { + public void paint() { + System.out.println("Rendering a button in Windows style."); + } +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/checkBox/Checkbox.java b/chapter4,5/seungwon/abstractFactoryPattern/checkBox/Checkbox.java new file mode 100644 index 0000000..ceb627f --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/checkBox/Checkbox.java @@ -0,0 +1,5 @@ +package tmp.abstractFactory.checkBox; + +public interface Checkbox { + void paint(); +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/checkBox/MacCheckbox.java b/chapter4,5/seungwon/abstractFactoryPattern/checkBox/MacCheckbox.java new file mode 100644 index 0000000..ea60fb2 --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/checkBox/MacCheckbox.java @@ -0,0 +1,7 @@ +package tmp.abstractFactory.checkBox; + +public class MacCheckbox implements Checkbox { + public void paint() { + System.out.println("Rendering a checkbox in Mac style."); + } +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/checkBox/WinCheckbox.java b/chapter4,5/seungwon/abstractFactoryPattern/checkBox/WinCheckbox.java new file mode 100644 index 0000000..66eb147 --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/checkBox/WinCheckbox.java @@ -0,0 +1,7 @@ +package tmp.abstractFactory.checkBox; + +public class WinCheckbox implements Checkbox { + public void paint() { + System.out.println("Rendering a checkbox in Windows style."); + } +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/factory/GUIFactory.java b/chapter4,5/seungwon/abstractFactoryPattern/factory/GUIFactory.java new file mode 100644 index 0000000..ec0a5ac --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/factory/GUIFactory.java @@ -0,0 +1,10 @@ +package tmp.abstractFactory.factory; + +import tmp.abstractFactory.checkBox.Checkbox; +import tmp.abstractFactory.button.Button; + +public interface GUIFactory { + Button createButton(); + + Checkbox createCheckbox(); +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/factory/MacFactory.java b/chapter4,5/seungwon/abstractFactoryPattern/factory/MacFactory.java new file mode 100644 index 0000000..f6f86d6 --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/factory/MacFactory.java @@ -0,0 +1,28 @@ +package tmp.abstractFactory.factory; + +import tmp.abstractFactory.checkBox.Checkbox; +import tmp.abstractFactory.checkBox.MacCheckbox; +import tmp.abstractFactory.button.Button; +import tmp.abstractFactory.button.MacButton; + +public class MacFactory implements GUIFactory { + private static MacFactory instance; + + private MacFactory() { + } + + public static MacFactory getInstance() { + if (instance == null) { + instance = new MacFactory(); + } + return instance; + } + + public Button createButton() { + return new MacButton(); + } + + public Checkbox createCheckbox() { + return new MacCheckbox(); + } +} diff --git a/chapter4,5/seungwon/abstractFactoryPattern/factory/WinFactory.java b/chapter4,5/seungwon/abstractFactoryPattern/factory/WinFactory.java new file mode 100644 index 0000000..da5c251 --- /dev/null +++ b/chapter4,5/seungwon/abstractFactoryPattern/factory/WinFactory.java @@ -0,0 +1,27 @@ + +import tmp.abstractFactory.checkBox.Checkbox; +import tmp.abstractFactory.button.Button; +import tmp.abstractFactory.button.WinButton; +import tmp.abstractFactory.checkBox.WinCheckbox; + +public class WinFactory implements GUIFactory { + private static WinFactory instance; + + private WinFactory() { + } + + public static WinFactory getInstance() { + if (instance == null) { + instance = new WinFactory(); + } + return instance; + } + + public Button createButton() { + return new WinButton(); + } + + public Checkbox createCheckbox() { + return new WinCheckbox(); + } +} diff --git a/chapter8/seungwon/templateMethodPattern/Creature.java b/chapter8/seungwon/templateMethodPattern/Creature.java new file mode 100644 index 0000000..c15569a --- /dev/null +++ b/chapter8/seungwon/templateMethodPattern/Creature.java @@ -0,0 +1,19 @@ +package chapter8.seungwon.templateMethodPattern; + +public class Creature { + private int x; + private int y; + + public Creature(int x, int y) { + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } +} diff --git a/chapter8/seungwon/templateMethodPattern/GameAI.java b/chapter8/seungwon/templateMethodPattern/GameAI.java new file mode 100644 index 0000000..64b2889 --- /dev/null +++ b/chapter8/seungwon/templateMethodPattern/GameAI.java @@ -0,0 +1,46 @@ +package chapter8.seungwon.templateMethodPattern; + +import java.util.List; + +abstract class GameAI { + public void turn() { + collectResources(); + buildStructures(); + buildUnits(); + attack(); + } + + protected void collectResources() { + for (String s : buildStructures()) { + System.out.println("ready to build " + s); + } + } + + protected abstract List buildStructures(); + + protected abstract void buildUnits(); + + protected void attack() { + Creature enemy = closestEnemy(); + if (enemy != null) { + sendWarriors(enemy.getPosition()); + } else { + sendScouts("center"); + } + } + + private Creature closestEnemy() { + Creature enemy = new Creature(100, 200); + return enemy; + } + + private void sendScouts(String position) { + System.out.println("go to map center"); + } + + private void sendWarriors(Creature position) { + int x = position.getX(); + int y = position.getY(); + System.out.println("go to (" + x + ", " + y + ")"); + } +} diff --git a/chapter8/seungwon/templateMethodPattern/MonstersAI.java b/chapter8/seungwon/templateMethodPattern/MonstersAI.java new file mode 100644 index 0000000..8026441 --- /dev/null +++ b/chapter8/seungwon/templateMethodPattern/MonstersAI.java @@ -0,0 +1,17 @@ +package chapter8.seungwon.templateMethodPattern; + +import java.util.ArrayList; +import java.util.List; + +public class MonstersAI extends GameAI { + protected void collectResources() { + } + + protected List buildStructures() { + List structures = new ArrayList<>(); + return structures; + } + + protected void buildUnits() { + } +} diff --git a/chapter8/seungwon/templateMethodPattern/OrcsAI.java b/chapter8/seungwon/templateMethodPattern/OrcsAI.java new file mode 100644 index 0000000..5421e55 --- /dev/null +++ b/chapter8/seungwon/templateMethodPattern/OrcsAI.java @@ -0,0 +1,18 @@ +package chapter8.seungwon.templateMethodPattern; + +import java.util.ArrayList; +import java.util.List; + +public class OrcsAI extends GameAI { + protected List buildStructures() { + List structures = new ArrayList<>(); + structures.add("farm"); + structures.add("castle"); + structures.add("stronghold"); + return structures; + } + + protected void buildUnits() { + System.out.println("Build peon, add it to scouts group."); + } +} diff --git a/chapter9/seungwon/compositePattern/App.java b/chapter9/seungwon/compositePattern/App.java new file mode 100644 index 0000000..e7c83aa --- /dev/null +++ b/chapter9/seungwon/compositePattern/App.java @@ -0,0 +1,30 @@ +package chapter9.seungwon.compositePattern; + +class App { + public void process(Dot dot) { + dot.draw(); + dot.move(1, 2); + dot.draw(); + } + + public App() { + Circle circle = new Circle(1, 1, 1); + process(circle); + System.out.println("=========Process========="); + + CompoundGraphic all = new CompoundGraphic(); + all.add(new Dot(1, 2)); + all.add(new Circle(5, 3, 10)); + + CompoundGraphic child = new CompoundGraphic(); + child.add(new Dot(2, 1)); + child.move(2, -3); + child.add(new Circle(0, 1, 2)); + child.move(-9, -3); + child.draw(); + System.out.println("=========Child========="); + + all.add(child); + all.draw(); + } +} diff --git a/chapter9/seungwon/compositePattern/Circle.java b/chapter9/seungwon/compositePattern/Circle.java new file mode 100644 index 0000000..bc5402f --- /dev/null +++ b/chapter9/seungwon/compositePattern/Circle.java @@ -0,0 +1,28 @@ +package chapter9.seungwon.compositePattern; + +class Circle extends Dot { + private final int radius; + + public Circle(int x, int y, int radius) { + super(x, y); + this.radius = radius; + } + + public void draw() { + System.out.println("Draw Circle - (" + x + ", " + y + "), radius : " + radius + "."); + int cnt = 4; + double alpha = 0.0; + for (int i = 0; i < cnt; ++i) { + System.out.print(" "); + new Dot(x + (int)(radius * Math.sin(alpha)), y + (int)(radius * Math.cos(alpha))).draw(); + alpha += 2 * Math.PI / cnt; + } + } + + public void bound(int[] top, int[] bottom, int[] left, int[] right) { + top[0] = Math.max(top[0], y + radius); + bottom[0] = Math.min(bottom[0], y - radius); + left[0] = Math.min(left[0], x - radius); + right[0] = Math.max(right[0], x + radius); + } +} diff --git a/chapter9/seungwon/compositePattern/CompoundGraphic.java b/chapter9/seungwon/compositePattern/CompoundGraphic.java new file mode 100644 index 0000000..5893c01 --- /dev/null +++ b/chapter9/seungwon/compositePattern/CompoundGraphic.java @@ -0,0 +1,52 @@ +package chapter9.seungwon.compositePattern; + +import java.util.ArrayList; +import java.util.List; + +class CompoundGraphic implements Graphic { + private final List children; + + public CompoundGraphic() { + children = new ArrayList<>(); + } + + public void add(Graphic graphic) { + children.add(graphic); + } + + public void remove(Graphic graphic) { + children.remove(graphic); + } + + public void move(int x, int y) { + for (Graphic graphic : children) { + graphic.move(x, y); + } + } + + public void draw() { + System.out.println("Draw CompoundGraphic:"); + for (Graphic graphic : children) { + graphic.draw(); + } + if (!children.isEmpty()) { + int top = Integer.MIN_VALUE; + int bottom = Integer.MAX_VALUE; + int left = Integer.MAX_VALUE; + int right = Integer.MIN_VALUE; + bound(new int[] {top}, new int[] {bottom}, new int[] {left}, new int[] {right}); + System.out.println(" Draw Rectangle:"); + System.out.println(" left: " + left + " right: " + right + " top: " + top + " bottom: " + bottom); + } + } + + public void bound(int[] top, int[] bottom, int[] left, int[] right) { + for (Graphic graphic : children) { + graphic.bound(top, bottom, left, right); + } + top[0] += 1; + bottom[0] -= 1; + left[0] -= 1; + right[0] += 1; + } +} diff --git a/chapter9/seungwon/compositePattern/Dot.java b/chapter9/seungwon/compositePattern/Dot.java new file mode 100644 index 0000000..6eca831 --- /dev/null +++ b/chapter9/seungwon/compositePattern/Dot.java @@ -0,0 +1,27 @@ +package chapter9.seungwon.compositePattern; + +class Dot implements Graphic { + private int x; + private int y; + + public Dot(int x, int y) { + this.x = x; + this.y = y; + } + + public void move(int x, int y) { + this.x += x; + this.y += y; + } + + public void draw() { + System.out.println("Draw dot (" + x + ", " + y + ")"); + } + + public void bound(int[] top, int[] bottom, int[] left, int[] right) { + top[0] = Math.max(top[0], y); + bottom[0] = Math.min(bottom[0], y); + left[0] = Math.min(left[0], x); + right[0] = Math.max(right[0], x); + } +} diff --git a/chapter9/seungwon/compositePattern/Graphic.java b/chapter9/seungwon/compositePattern/Graphic.java new file mode 100644 index 0000000..5988948 --- /dev/null +++ b/chapter9/seungwon/compositePattern/Graphic.java @@ -0,0 +1,9 @@ +package chapter9.seungwon.compositePattern; + +interface Graphic { + void move(int x, int y); + + void draw(); + + void bound(int[] top, int[] bottom, int[] left, int[] right); +} diff --git a/chapter9/seungwon/compositePattern/Main.java b/chapter9/seungwon/compositePattern/Main.java new file mode 100644 index 0000000..a0c0717 --- /dev/null +++ b/chapter9/seungwon/compositePattern/Main.java @@ -0,0 +1,7 @@ +package chapter9.seungwon.compositePattern; + +public class Main { + public static void main(String[] args) { + new App(); + } +} diff --git a/chapter9/seungwon/iteratorPattern/App.java b/chapter9/seungwon/iteratorPattern/App.java new file mode 100644 index 0000000..7961843 --- /dev/null +++ b/chapter9/seungwon/iteratorPattern/App.java @@ -0,0 +1,11 @@ +package chapter9.seungwon.iteratorPattern; + +class App { + public App() { + SocialNetwork network = new Facebook(); + ProfileIterator fit = network.createFriendsIterator("id1"); + ProfileIterator wit = network.createCoworkersIterator("id2"); + SocialSpammer.send(fit, "hello friend"); + SocialSpammer.send(wit, "hello coworker"); + } +} diff --git a/chapter9/seungwon/iteratorPattern/Facebook.java b/chapter9/seungwon/iteratorPattern/Facebook.java new file mode 100644 index 0000000..4ad243e --- /dev/null +++ b/chapter9/seungwon/iteratorPattern/Facebook.java @@ -0,0 +1,24 @@ +package chapter9.seungwon.iteratorPattern; + +import java.util.ArrayList; +import java.util.List; + +class Facebook implements SocialNetwork { + public List socialGraphRequest(String profileId, String type) { + if (type.equals("friends")) { + return List.of("f1", "f2", "f3", "f4", "f5"); + } else if (type.equals("coworkers")) { + return List.of("w1", "w2", "w3", "w4"); + } else { + return new ArrayList<>(); + } + } + + public ProfileIterator createFriendsIterator(String profileId) { + return new FacebookIterator(this, profileId, "friends"); + } + + public ProfileIterator createCoworkersIterator(String profileId) { + return new FacebookIterator(this, profileId, "coworkers"); + } +} diff --git a/chapter9/seungwon/iteratorPattern/FacebookIterator.java b/chapter9/seungwon/iteratorPattern/FacebookIterator.java new file mode 100644 index 0000000..229aa82 --- /dev/null +++ b/chapter9/seungwon/iteratorPattern/FacebookIterator.java @@ -0,0 +1,40 @@ +package chapter9.seungwon.iteratorPattern; + +import java.util.ArrayList; +import java.util.List; + +class FacebookIterator implements ProfileIterator { + private final Facebook facebook; + private final String profileId; + private final String type; + private List cache; + private int currentPosition; + + public FacebookIterator(Facebook facebook, String profileId, String type) { + this.facebook = facebook; + this.profileId = profileId; + this.type = type; + this.cache = new ArrayList<>(); + this.currentPosition = 0; + } + + private void lazyInit() { + if (cache.isEmpty()) { + cache = facebook.socialGraphRequest(profileId, type); + } + } + + public String getNext() { + if (hasMore()) { + String ret = cache.get(currentPosition); + currentPosition++; + return ret; + } + return ""; + } + + public boolean hasMore() { + lazyInit(); + return currentPosition < cache.size(); + } +} diff --git a/chapter9/seungwon/iteratorPattern/Main.java b/chapter9/seungwon/iteratorPattern/Main.java new file mode 100644 index 0000000..a7c1676 --- /dev/null +++ b/chapter9/seungwon/iteratorPattern/Main.java @@ -0,0 +1,7 @@ +package chapter9.seungwon.iteratorPattern; + +public class Main { + public static void main(String[] args) { + new App(); + } +} diff --git a/chapter9/seungwon/iteratorPattern/ProfileIterator.java b/chapter9/seungwon/iteratorPattern/ProfileIterator.java new file mode 100644 index 0000000..0201566 --- /dev/null +++ b/chapter9/seungwon/iteratorPattern/ProfileIterator.java @@ -0,0 +1,7 @@ +package chapter9.seungwon.iteratorPattern; + +interface ProfileIterator { + String getNext(); + + boolean hasMore(); +} diff --git a/chapter9/seungwon/iteratorPattern/SocialNetwork.java b/chapter9/seungwon/iteratorPattern/SocialNetwork.java new file mode 100644 index 0000000..5c83965 --- /dev/null +++ b/chapter9/seungwon/iteratorPattern/SocialNetwork.java @@ -0,0 +1,7 @@ +package chapter9.seungwon.iteratorPattern; + +interface SocialNetwork { + ProfileIterator createFriendsIterator(String profileId); + + ProfileIterator createCoworkersIterator(String profileId); +} diff --git a/chapter9/seungwon/iteratorPattern/SocialSpammer.java b/chapter9/seungwon/iteratorPattern/SocialSpammer.java new file mode 100644 index 0000000..945ca8f --- /dev/null +++ b/chapter9/seungwon/iteratorPattern/SocialSpammer.java @@ -0,0 +1,10 @@ +package chapter9.seungwon.iteratorPattern; + +class SocialSpammer { + public static void send(ProfileIterator iterator, String message) { + while (iterator.hasMore()) { + String profile = iterator.getNext(); + System.out.println("Send " + message + " to " + profile); + } + } +}