From ab142043205f09a8cd783d12050ab2522ba839fd Mon Sep 17 00:00:00 2001 From: SW-H Date: Tue, 6 Jun 2023 19:41:53 +0900 Subject: [PATCH 1/9] =?UTF-8?q?feat=20:=20=EC=A0=84=EB=9E=B5=20=ED=8C=A8?= =?UTF-8?q?=ED=84=B4=20=EC=A0=81=EC=9A=A9(=EC=95=A1=EC=85=98=20=EC=96=B4?= =?UTF-8?q?=EB=93=9C=EB=B2=A4=EC=B2=98=20=EA=B2=8C=EC=9E=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../strategyPattern/ActionAdventureSimulator.java | 13 +++++++++++++ .../strategyPattern/behavior/AxeBehavior.java | 8 ++++++++ .../behavior/BowAndArrowBehavior.java | 8 ++++++++ .../strategyPattern/behavior/KnifeBehavior.java | 8 ++++++++ .../strategyPattern/behavior/SwordBehavior.java | 8 ++++++++ .../strategyPattern/behavior/WeaponBehavior.java | 5 +++++ .../strategyPattern/character/Character.java | 14 ++++++++++++++ .../seungwon/strategyPattern/character/King.java | 14 ++++++++++++++ .../seungwon/strategyPattern/character/Knight.java | 14 ++++++++++++++ .../seungwon/strategyPattern/character/Queen.java | 14 ++++++++++++++ .../seungwon/strategyPattern/character/Troll.java | 14 ++++++++++++++ 11 files changed, 120 insertions(+) create mode 100644 chapter1/seungwon/strategyPattern/ActionAdventureSimulator.java create mode 100644 chapter1/seungwon/strategyPattern/behavior/AxeBehavior.java create mode 100644 chapter1/seungwon/strategyPattern/behavior/BowAndArrowBehavior.java create mode 100644 chapter1/seungwon/strategyPattern/behavior/KnifeBehavior.java create mode 100644 chapter1/seungwon/strategyPattern/behavior/SwordBehavior.java create mode 100644 chapter1/seungwon/strategyPattern/behavior/WeaponBehavior.java create mode 100644 chapter1/seungwon/strategyPattern/character/Character.java create mode 100644 chapter1/seungwon/strategyPattern/character/King.java create mode 100644 chapter1/seungwon/strategyPattern/character/Knight.java create mode 100644 chapter1/seungwon/strategyPattern/character/Queen.java create mode 100644 chapter1/seungwon/strategyPattern/character/Troll.java 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/seungwon/strategyPattern/behavior/WeaponBehavior.java b/chapter1/seungwon/strategyPattern/behavior/WeaponBehavior.java new file mode 100644 index 0000000..47200cc --- /dev/null +++ b/chapter1/seungwon/strategyPattern/behavior/WeaponBehavior.java @@ -0,0 +1,5 @@ +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 From a0c0b792e47c5677d96b0af1470229ecfedf3f61 Mon Sep 17 00:00:00 2001 From: SW-H Date: Tue, 20 Jun 2023 16:32:23 +0900 Subject: [PATCH 2/9] refactor --- .../design_puzzle/behavior/AxeBehavior.java | 8 -------- .../design_puzzle/behavior/BowAndArrowBehavior.java | 8 -------- .../design_puzzle/behavior/KnifeBehavior.java | 9 --------- .../design_puzzle/behavior/SwordBehavior.java | 8 -------- .../design_puzzle/behavior/WeaponBehavior.java | 5 ----- .../design_puzzle/character/Character.java | 13 ------------- .../byeonggon/design_puzzle/character/King.java | 9 --------- .../byeonggon/design_puzzle/character/Knight.java | 11 ----------- .../byeonggon/design_puzzle/character/Queen.java | 13 ------------- .../byeonggon/design_puzzle/character/Troll.java | 9 --------- 10 files changed, 93 deletions(-) delete mode 100644 chapter1/byeonggon/design_puzzle/behavior/AxeBehavior.java delete mode 100644 chapter1/byeonggon/design_puzzle/behavior/BowAndArrowBehavior.java delete mode 100644 chapter1/byeonggon/design_puzzle/behavior/KnifeBehavior.java delete mode 100644 chapter1/byeonggon/design_puzzle/behavior/SwordBehavior.java delete mode 100644 chapter1/byeonggon/design_puzzle/behavior/WeaponBehavior.java delete mode 100644 chapter1/byeonggon/design_puzzle/character/Character.java delete mode 100644 chapter1/byeonggon/design_puzzle/character/King.java delete mode 100644 chapter1/byeonggon/design_puzzle/character/Knight.java delete mode 100644 chapter1/byeonggon/design_puzzle/character/Queen.java delete mode 100644 chapter1/byeonggon/design_puzzle/character/Troll.java 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/behavior/WeaponBehavior.java b/chapter1/byeonggon/design_puzzle/behavior/WeaponBehavior.java deleted file mode 100644 index 97df348..0000000 --- a/chapter1/byeonggon/design_puzzle/behavior/WeaponBehavior.java +++ /dev/null @@ -1,5 +0,0 @@ -package chapter1.behavior; - -public interface WeaponBehavior { - void useWeapon(); -} 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(); - } -} From 393574c8c4b80948cb6466d562c3870ce698fad2 Mon Sep 17 00:00:00 2001 From: SW-H Date: Tue, 20 Jun 2023 16:33:14 +0900 Subject: [PATCH 3/9] =?UTF-8?q?feat=20:=20=EC=98=B5=EC=A0=80=EB=B2=84=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4=20=EC=A0=81=EC=9A=A9(=EC=A3=BC=EC=8B=9D?= =?UTF-8?q?=ED=9A=8C=EC=82=AC&=EA=B3=A0=EA=B0=9D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../observerPattern/Observer/Observer.java | 5 +++ .../observerPattern/Observer/Subsribers.java | 27 ++++++++++++ .../observerPattern/Subject/StockCompany.java | 41 +++++++++++++++++++ .../observerPattern/Subject/Subject.java | 9 ++++ 4 files changed, 82 insertions(+) create mode 100644 chapter2/seungwon/observerPattern/Observer/Observer.java create mode 100644 chapter2/seungwon/observerPattern/Observer/Subsribers.java create mode 100644 chapter2/seungwon/observerPattern/Subject/StockCompany.java create mode 100644 chapter2/seungwon/observerPattern/Subject/Subject.java 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); +} From ec5135db0c9018115de7ebd5b6118540b523283d Mon Sep 17 00:00:00 2001 From: SW-H Date: Tue, 20 Jun 2023 16:33:31 +0900 Subject: [PATCH 4/9] =?UTF-8?q?feat=20:=20=EB=8D=B0=EC=BD=94=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=ED=8C=A8=ED=84=B4=20=EC=A0=81=EC=9A=A9(?= =?UTF-8?q?=EA=B0=9C=EC=9D=B8=EC=A0=95=EB=B3=B4=20=EC=B2=98=EB=A6=AC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../decoratorPattern/DataProcessor.java | 9 +++++ .../seungwon/decoratorPattern/Decryptor.java | 34 +++++++++++++++++++ .../seungwon/decoratorPattern/Encryptor.java | 34 +++++++++++++++++++ .../decoratorPattern/InputProcessor.java | 32 +++++++++++++++++ chapter2/seungwon/decoratorPattern/Main.java | 12 +++++++ .../decoratorPattern/OutputProcessor.java | 25 ++++++++++++++ chapter2/seungwon/decoratorPattern/Saver.java | 26 ++++++++++++++ .../seungwon/decoratorPattern/Validator.java | 33 ++++++++++++++++++ 8 files changed, 205 insertions(+) create mode 100644 chapter2/seungwon/decoratorPattern/DataProcessor.java create mode 100644 chapter2/seungwon/decoratorPattern/Decryptor.java create mode 100644 chapter2/seungwon/decoratorPattern/Encryptor.java create mode 100644 chapter2/seungwon/decoratorPattern/InputProcessor.java create mode 100644 chapter2/seungwon/decoratorPattern/Main.java create mode 100644 chapter2/seungwon/decoratorPattern/OutputProcessor.java create mode 100644 chapter2/seungwon/decoratorPattern/Saver.java create mode 100644 chapter2/seungwon/decoratorPattern/Validator.java diff --git a/chapter2/seungwon/decoratorPattern/DataProcessor.java b/chapter2/seungwon/decoratorPattern/DataProcessor.java new file mode 100644 index 0000000..9bae10b --- /dev/null +++ b/chapter2/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/chapter2/seungwon/decoratorPattern/Decryptor.java b/chapter2/seungwon/decoratorPattern/Decryptor.java new file mode 100644 index 0000000..1d97232 --- /dev/null +++ b/chapter2/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/chapter2/seungwon/decoratorPattern/Encryptor.java b/chapter2/seungwon/decoratorPattern/Encryptor.java new file mode 100644 index 0000000..3556816 --- /dev/null +++ b/chapter2/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/chapter2/seungwon/decoratorPattern/InputProcessor.java b/chapter2/seungwon/decoratorPattern/InputProcessor.java new file mode 100644 index 0000000..e629f45 --- /dev/null +++ b/chapter2/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/chapter2/seungwon/decoratorPattern/Main.java b/chapter2/seungwon/decoratorPattern/Main.java new file mode 100644 index 0000000..030fd95 --- /dev/null +++ b/chapter2/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/chapter2/seungwon/decoratorPattern/OutputProcessor.java b/chapter2/seungwon/decoratorPattern/OutputProcessor.java new file mode 100644 index 0000000..3f629ef --- /dev/null +++ b/chapter2/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/chapter2/seungwon/decoratorPattern/Saver.java b/chapter2/seungwon/decoratorPattern/Saver.java new file mode 100644 index 0000000..17c0fb4 --- /dev/null +++ b/chapter2/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/chapter2/seungwon/decoratorPattern/Validator.java b/chapter2/seungwon/decoratorPattern/Validator.java new file mode 100644 index 0000000..ca38acd --- /dev/null +++ b/chapter2/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); + } +} From efa5b9ec76ede35f8a244fb669be32e9ade79899 Mon Sep 17 00:00:00 2001 From: SW-H Date: Tue, 20 Jun 2023 22:06:47 +0900 Subject: [PATCH 5/9] refactor --- .../seungwon/decoratorPattern/DataProcessor.java | 0 {chapter2 => chapter3}/seungwon/decoratorPattern/Decryptor.java | 0 {chapter2 => chapter3}/seungwon/decoratorPattern/Encryptor.java | 0 .../seungwon/decoratorPattern/InputProcessor.java | 0 {chapter2 => chapter3}/seungwon/decoratorPattern/Main.java | 0 .../seungwon/decoratorPattern/OutputProcessor.java | 0 {chapter2 => chapter3}/seungwon/decoratorPattern/Saver.java | 0 {chapter2 => chapter3}/seungwon/decoratorPattern/Validator.java | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {chapter2 => chapter3}/seungwon/decoratorPattern/DataProcessor.java (100%) rename {chapter2 => chapter3}/seungwon/decoratorPattern/Decryptor.java (100%) rename {chapter2 => chapter3}/seungwon/decoratorPattern/Encryptor.java (100%) rename {chapter2 => chapter3}/seungwon/decoratorPattern/InputProcessor.java (100%) rename {chapter2 => chapter3}/seungwon/decoratorPattern/Main.java (100%) rename {chapter2 => chapter3}/seungwon/decoratorPattern/OutputProcessor.java (100%) rename {chapter2 => chapter3}/seungwon/decoratorPattern/Saver.java (100%) rename {chapter2 => chapter3}/seungwon/decoratorPattern/Validator.java (100%) diff --git a/chapter2/seungwon/decoratorPattern/DataProcessor.java b/chapter3/seungwon/decoratorPattern/DataProcessor.java similarity index 100% rename from chapter2/seungwon/decoratorPattern/DataProcessor.java rename to chapter3/seungwon/decoratorPattern/DataProcessor.java diff --git a/chapter2/seungwon/decoratorPattern/Decryptor.java b/chapter3/seungwon/decoratorPattern/Decryptor.java similarity index 100% rename from chapter2/seungwon/decoratorPattern/Decryptor.java rename to chapter3/seungwon/decoratorPattern/Decryptor.java diff --git a/chapter2/seungwon/decoratorPattern/Encryptor.java b/chapter3/seungwon/decoratorPattern/Encryptor.java similarity index 100% rename from chapter2/seungwon/decoratorPattern/Encryptor.java rename to chapter3/seungwon/decoratorPattern/Encryptor.java diff --git a/chapter2/seungwon/decoratorPattern/InputProcessor.java b/chapter3/seungwon/decoratorPattern/InputProcessor.java similarity index 100% rename from chapter2/seungwon/decoratorPattern/InputProcessor.java rename to chapter3/seungwon/decoratorPattern/InputProcessor.java diff --git a/chapter2/seungwon/decoratorPattern/Main.java b/chapter3/seungwon/decoratorPattern/Main.java similarity index 100% rename from chapter2/seungwon/decoratorPattern/Main.java rename to chapter3/seungwon/decoratorPattern/Main.java diff --git a/chapter2/seungwon/decoratorPattern/OutputProcessor.java b/chapter3/seungwon/decoratorPattern/OutputProcessor.java similarity index 100% rename from chapter2/seungwon/decoratorPattern/OutputProcessor.java rename to chapter3/seungwon/decoratorPattern/OutputProcessor.java diff --git a/chapter2/seungwon/decoratorPattern/Saver.java b/chapter3/seungwon/decoratorPattern/Saver.java similarity index 100% rename from chapter2/seungwon/decoratorPattern/Saver.java rename to chapter3/seungwon/decoratorPattern/Saver.java diff --git a/chapter2/seungwon/decoratorPattern/Validator.java b/chapter3/seungwon/decoratorPattern/Validator.java similarity index 100% rename from chapter2/seungwon/decoratorPattern/Validator.java rename to chapter3/seungwon/decoratorPattern/Validator.java From d9b18c3b5288878b919340caf3c6d37aac707e40 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 22 Jun 2023 02:27:20 +0900 Subject: [PATCH 6/9] =?UTF-8?q?feat=20:=20=EC=B6=94=EC=83=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=ED=8C=A8=ED=84=B4=20&=20=EC=8B=B1?= =?UTF-8?q?=EA=B8=80=ED=86=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chapter4,5/abstractFactory/Application.java | 21 ++++++++++++++ .../ApplicationConfigurator.java | 29 +++++++++++++++++++ chapter4,5/abstractFactory/button/Button.java | 5 ++++ .../abstractFactory/button/MacButton.java | 7 +++++ .../abstractFactory/button/WinButton.java | 7 +++++ .../abstractFactory/checkBox/Checkbox.java | 5 ++++ .../abstractFactory/checkBox/MacCheckbox.java | 7 +++++ .../abstractFactory/checkBox/WinCheckbox.java | 7 +++++ .../abstractFactory/factory/GUIFactory.java | 10 +++++++ .../abstractFactory/factory/MacFactory.java | 28 ++++++++++++++++++ .../abstractFactory/factory/WinFactory.java | 28 ++++++++++++++++++ 11 files changed, 154 insertions(+) create mode 100644 chapter4,5/abstractFactory/Application.java create mode 100644 chapter4,5/abstractFactory/ApplicationConfigurator.java create mode 100644 chapter4,5/abstractFactory/button/Button.java create mode 100644 chapter4,5/abstractFactory/button/MacButton.java create mode 100644 chapter4,5/abstractFactory/button/WinButton.java create mode 100644 chapter4,5/abstractFactory/checkBox/Checkbox.java create mode 100644 chapter4,5/abstractFactory/checkBox/MacCheckbox.java create mode 100644 chapter4,5/abstractFactory/checkBox/WinCheckbox.java create mode 100644 chapter4,5/abstractFactory/factory/GUIFactory.java create mode 100644 chapter4,5/abstractFactory/factory/MacFactory.java create mode 100644 chapter4,5/abstractFactory/factory/WinFactory.java diff --git a/chapter4,5/abstractFactory/Application.java b/chapter4,5/abstractFactory/Application.java new file mode 100644 index 0000000..abe642a --- /dev/null +++ b/chapter4,5/abstractFactory/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/abstractFactory/ApplicationConfigurator.java b/chapter4,5/abstractFactory/ApplicationConfigurator.java new file mode 100644 index 0000000..809f4b9 --- /dev/null +++ b/chapter4,5/abstractFactory/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/abstractFactory/button/Button.java b/chapter4,5/abstractFactory/button/Button.java new file mode 100644 index 0000000..9ab13e7 --- /dev/null +++ b/chapter4,5/abstractFactory/button/Button.java @@ -0,0 +1,5 @@ +package tmp.abstractFactory.button; + +public interface Button { + void paint(); +} diff --git a/chapter4,5/abstractFactory/button/MacButton.java b/chapter4,5/abstractFactory/button/MacButton.java new file mode 100644 index 0000000..ef13848 --- /dev/null +++ b/chapter4,5/abstractFactory/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/abstractFactory/button/WinButton.java b/chapter4,5/abstractFactory/button/WinButton.java new file mode 100644 index 0000000..3d7ca18 --- /dev/null +++ b/chapter4,5/abstractFactory/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/abstractFactory/checkBox/Checkbox.java b/chapter4,5/abstractFactory/checkBox/Checkbox.java new file mode 100644 index 0000000..ceb627f --- /dev/null +++ b/chapter4,5/abstractFactory/checkBox/Checkbox.java @@ -0,0 +1,5 @@ +package tmp.abstractFactory.checkBox; + +public interface Checkbox { + void paint(); +} diff --git a/chapter4,5/abstractFactory/checkBox/MacCheckbox.java b/chapter4,5/abstractFactory/checkBox/MacCheckbox.java new file mode 100644 index 0000000..ea60fb2 --- /dev/null +++ b/chapter4,5/abstractFactory/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/abstractFactory/checkBox/WinCheckbox.java b/chapter4,5/abstractFactory/checkBox/WinCheckbox.java new file mode 100644 index 0000000..66eb147 --- /dev/null +++ b/chapter4,5/abstractFactory/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/abstractFactory/factory/GUIFactory.java b/chapter4,5/abstractFactory/factory/GUIFactory.java new file mode 100644 index 0000000..ec0a5ac --- /dev/null +++ b/chapter4,5/abstractFactory/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/abstractFactory/factory/MacFactory.java b/chapter4,5/abstractFactory/factory/MacFactory.java new file mode 100644 index 0000000..f6f86d6 --- /dev/null +++ b/chapter4,5/abstractFactory/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/abstractFactory/factory/WinFactory.java b/chapter4,5/abstractFactory/factory/WinFactory.java new file mode 100644 index 0000000..bd0bdb2 --- /dev/null +++ b/chapter4,5/abstractFactory/factory/WinFactory.java @@ -0,0 +1,28 @@ +package tmp.abstractFactory.factory; + +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(); + } +} From 25af5ddd771d0e16513679233d92899904bf9cba Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 13 Jul 2023 04:55:23 +0900 Subject: [PATCH 7/9] feat : template method pattern, iterator pattern, composite pattern --- .../abstractFactory/Application.java | 0 .../ApplicationConfigurator.java | 0 .../abstractFactory/button/Button.java | 0 .../abstractFactory/button/MacButton.java | 0 .../abstractFactory/button/WinButton.java | 0 .../abstractFactory/checkBox/Checkbox.java | 0 .../abstractFactory/checkBox/MacCheckbox.java | 0 .../abstractFactory/checkBox/WinCheckbox.java | 0 .../abstractFactory/factory/GUIFactory.java | 0 .../abstractFactory/factory/MacFactory.java | 0 .../abstractFactory/factory/WinFactory.java | 1 - chapter9/seungwon/compositePattern/App.java | 30 +++++++++++ .../seungwon/compositePattern/Circle.java | 28 ++++++++++ .../compositePattern/CompoundGraphic.java | 52 +++++++++++++++++++ chapter9/seungwon/compositePattern/Dot.java | 27 ++++++++++ .../seungwon/compositePattern/Graphic.java | 9 ++++ chapter9/seungwon/compositePattern/Main.java | 7 +++ .../seungwon/iteratorPattern/Facebook.java | 24 +++++++++ .../iteratorPattern/FacebookIterator.java | 40 ++++++++++++++ chapter9/seungwon/iteratorPattern/Main.java | 7 +++ .../iteratorPattern/SocialSpammer.java | 10 ++++ 21 files changed, 234 insertions(+), 1 deletion(-) rename chapter4,5/{ => seungwon}/abstractFactory/Application.java (100%) rename chapter4,5/{ => seungwon}/abstractFactory/ApplicationConfigurator.java (100%) rename chapter4,5/{ => seungwon}/abstractFactory/button/Button.java (100%) rename chapter4,5/{ => seungwon}/abstractFactory/button/MacButton.java (100%) rename chapter4,5/{ => seungwon}/abstractFactory/button/WinButton.java (100%) rename chapter4,5/{ => seungwon}/abstractFactory/checkBox/Checkbox.java (100%) rename chapter4,5/{ => seungwon}/abstractFactory/checkBox/MacCheckbox.java (100%) rename chapter4,5/{ => seungwon}/abstractFactory/checkBox/WinCheckbox.java (100%) rename chapter4,5/{ => seungwon}/abstractFactory/factory/GUIFactory.java (100%) rename chapter4,5/{ => seungwon}/abstractFactory/factory/MacFactory.java (100%) rename chapter4,5/{ => seungwon}/abstractFactory/factory/WinFactory.java (93%) create mode 100644 chapter9/seungwon/compositePattern/App.java create mode 100644 chapter9/seungwon/compositePattern/Circle.java create mode 100644 chapter9/seungwon/compositePattern/CompoundGraphic.java create mode 100644 chapter9/seungwon/compositePattern/Dot.java create mode 100644 chapter9/seungwon/compositePattern/Graphic.java create mode 100644 chapter9/seungwon/compositePattern/Main.java create mode 100644 chapter9/seungwon/iteratorPattern/Facebook.java create mode 100644 chapter9/seungwon/iteratorPattern/FacebookIterator.java create mode 100644 chapter9/seungwon/iteratorPattern/Main.java create mode 100644 chapter9/seungwon/iteratorPattern/SocialSpammer.java diff --git a/chapter4,5/abstractFactory/Application.java b/chapter4,5/seungwon/abstractFactory/Application.java similarity index 100% rename from chapter4,5/abstractFactory/Application.java rename to chapter4,5/seungwon/abstractFactory/Application.java diff --git a/chapter4,5/abstractFactory/ApplicationConfigurator.java b/chapter4,5/seungwon/abstractFactory/ApplicationConfigurator.java similarity index 100% rename from chapter4,5/abstractFactory/ApplicationConfigurator.java rename to chapter4,5/seungwon/abstractFactory/ApplicationConfigurator.java diff --git a/chapter4,5/abstractFactory/button/Button.java b/chapter4,5/seungwon/abstractFactory/button/Button.java similarity index 100% rename from chapter4,5/abstractFactory/button/Button.java rename to chapter4,5/seungwon/abstractFactory/button/Button.java diff --git a/chapter4,5/abstractFactory/button/MacButton.java b/chapter4,5/seungwon/abstractFactory/button/MacButton.java similarity index 100% rename from chapter4,5/abstractFactory/button/MacButton.java rename to chapter4,5/seungwon/abstractFactory/button/MacButton.java diff --git a/chapter4,5/abstractFactory/button/WinButton.java b/chapter4,5/seungwon/abstractFactory/button/WinButton.java similarity index 100% rename from chapter4,5/abstractFactory/button/WinButton.java rename to chapter4,5/seungwon/abstractFactory/button/WinButton.java diff --git a/chapter4,5/abstractFactory/checkBox/Checkbox.java b/chapter4,5/seungwon/abstractFactory/checkBox/Checkbox.java similarity index 100% rename from chapter4,5/abstractFactory/checkBox/Checkbox.java rename to chapter4,5/seungwon/abstractFactory/checkBox/Checkbox.java diff --git a/chapter4,5/abstractFactory/checkBox/MacCheckbox.java b/chapter4,5/seungwon/abstractFactory/checkBox/MacCheckbox.java similarity index 100% rename from chapter4,5/abstractFactory/checkBox/MacCheckbox.java rename to chapter4,5/seungwon/abstractFactory/checkBox/MacCheckbox.java diff --git a/chapter4,5/abstractFactory/checkBox/WinCheckbox.java b/chapter4,5/seungwon/abstractFactory/checkBox/WinCheckbox.java similarity index 100% rename from chapter4,5/abstractFactory/checkBox/WinCheckbox.java rename to chapter4,5/seungwon/abstractFactory/checkBox/WinCheckbox.java diff --git a/chapter4,5/abstractFactory/factory/GUIFactory.java b/chapter4,5/seungwon/abstractFactory/factory/GUIFactory.java similarity index 100% rename from chapter4,5/abstractFactory/factory/GUIFactory.java rename to chapter4,5/seungwon/abstractFactory/factory/GUIFactory.java diff --git a/chapter4,5/abstractFactory/factory/MacFactory.java b/chapter4,5/seungwon/abstractFactory/factory/MacFactory.java similarity index 100% rename from chapter4,5/abstractFactory/factory/MacFactory.java rename to chapter4,5/seungwon/abstractFactory/factory/MacFactory.java diff --git a/chapter4,5/abstractFactory/factory/WinFactory.java b/chapter4,5/seungwon/abstractFactory/factory/WinFactory.java similarity index 93% rename from chapter4,5/abstractFactory/factory/WinFactory.java rename to chapter4,5/seungwon/abstractFactory/factory/WinFactory.java index bd0bdb2..da5c251 100644 --- a/chapter4,5/abstractFactory/factory/WinFactory.java +++ b/chapter4,5/seungwon/abstractFactory/factory/WinFactory.java @@ -1,4 +1,3 @@ -package tmp.abstractFactory.factory; import tmp.abstractFactory.checkBox.Checkbox; import tmp.abstractFactory.button.Button; 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/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/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); + } + } +} From a3d291d0437d86fb26f313f312f92372e2d21635 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 13 Jul 2023 04:55:23 +0900 Subject: [PATCH 8/9] feat : template method pattern, iterator pattern, composite pattern --- .../templateMethodPattern/Creature.java | 19 ++++++++ .../templateMethodPattern/GameAI.java | 46 +++++++++++++++++++ .../templateMethodPattern/MonstersAI.java | 17 +++++++ .../templateMethodPattern/OrcsAI.java | 18 ++++++++ chapter9/seungwon/iteratorPattern/App.java | 11 +++++ .../iteratorPattern/ProfileIterator.java | 7 +++ .../iteratorPattern/SocialNetwork.java | 7 +++ 7 files changed, 125 insertions(+) create mode 100644 chapter8/seungwon/templateMethodPattern/Creature.java create mode 100644 chapter8/seungwon/templateMethodPattern/GameAI.java create mode 100644 chapter8/seungwon/templateMethodPattern/MonstersAI.java create mode 100644 chapter8/seungwon/templateMethodPattern/OrcsAI.java create mode 100644 chapter9/seungwon/iteratorPattern/App.java create mode 100644 chapter9/seungwon/iteratorPattern/ProfileIterator.java create mode 100644 chapter9/seungwon/iteratorPattern/SocialNetwork.java 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/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/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); +} From 3dfa14e58dfe508df94ec617f2dbbbca37086315 Mon Sep 17 00:00:00 2001 From: SW-H Date: Thu, 13 Jul 2023 13:04:39 +0900 Subject: [PATCH 9/9] refactor --- .../{abstractFactory => abstractFactoryPattern}/Application.java | 0 .../ApplicationConfigurator.java | 0 .../button/Button.java | 0 .../button/MacButton.java | 0 .../button/WinButton.java | 0 .../checkBox/Checkbox.java | 0 .../checkBox/MacCheckbox.java | 0 .../checkBox/WinCheckbox.java | 0 .../factory/GUIFactory.java | 0 .../factory/MacFactory.java | 0 .../factory/WinFactory.java | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/Application.java (100%) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/ApplicationConfigurator.java (100%) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/button/Button.java (100%) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/button/MacButton.java (100%) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/button/WinButton.java (100%) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/checkBox/Checkbox.java (100%) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/checkBox/MacCheckbox.java (100%) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/checkBox/WinCheckbox.java (100%) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/factory/GUIFactory.java (100%) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/factory/MacFactory.java (100%) rename chapter4,5/seungwon/{abstractFactory => abstractFactoryPattern}/factory/WinFactory.java (100%) diff --git a/chapter4,5/seungwon/abstractFactory/Application.java b/chapter4,5/seungwon/abstractFactoryPattern/Application.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/Application.java rename to chapter4,5/seungwon/abstractFactoryPattern/Application.java diff --git a/chapter4,5/seungwon/abstractFactory/ApplicationConfigurator.java b/chapter4,5/seungwon/abstractFactoryPattern/ApplicationConfigurator.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/ApplicationConfigurator.java rename to chapter4,5/seungwon/abstractFactoryPattern/ApplicationConfigurator.java diff --git a/chapter4,5/seungwon/abstractFactory/button/Button.java b/chapter4,5/seungwon/abstractFactoryPattern/button/Button.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/button/Button.java rename to chapter4,5/seungwon/abstractFactoryPattern/button/Button.java diff --git a/chapter4,5/seungwon/abstractFactory/button/MacButton.java b/chapter4,5/seungwon/abstractFactoryPattern/button/MacButton.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/button/MacButton.java rename to chapter4,5/seungwon/abstractFactoryPattern/button/MacButton.java diff --git a/chapter4,5/seungwon/abstractFactory/button/WinButton.java b/chapter4,5/seungwon/abstractFactoryPattern/button/WinButton.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/button/WinButton.java rename to chapter4,5/seungwon/abstractFactoryPattern/button/WinButton.java diff --git a/chapter4,5/seungwon/abstractFactory/checkBox/Checkbox.java b/chapter4,5/seungwon/abstractFactoryPattern/checkBox/Checkbox.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/checkBox/Checkbox.java rename to chapter4,5/seungwon/abstractFactoryPattern/checkBox/Checkbox.java diff --git a/chapter4,5/seungwon/abstractFactory/checkBox/MacCheckbox.java b/chapter4,5/seungwon/abstractFactoryPattern/checkBox/MacCheckbox.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/checkBox/MacCheckbox.java rename to chapter4,5/seungwon/abstractFactoryPattern/checkBox/MacCheckbox.java diff --git a/chapter4,5/seungwon/abstractFactory/checkBox/WinCheckbox.java b/chapter4,5/seungwon/abstractFactoryPattern/checkBox/WinCheckbox.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/checkBox/WinCheckbox.java rename to chapter4,5/seungwon/abstractFactoryPattern/checkBox/WinCheckbox.java diff --git a/chapter4,5/seungwon/abstractFactory/factory/GUIFactory.java b/chapter4,5/seungwon/abstractFactoryPattern/factory/GUIFactory.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/factory/GUIFactory.java rename to chapter4,5/seungwon/abstractFactoryPattern/factory/GUIFactory.java diff --git a/chapter4,5/seungwon/abstractFactory/factory/MacFactory.java b/chapter4,5/seungwon/abstractFactoryPattern/factory/MacFactory.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/factory/MacFactory.java rename to chapter4,5/seungwon/abstractFactoryPattern/factory/MacFactory.java diff --git a/chapter4,5/seungwon/abstractFactory/factory/WinFactory.java b/chapter4,5/seungwon/abstractFactoryPattern/factory/WinFactory.java similarity index 100% rename from chapter4,5/seungwon/abstractFactory/factory/WinFactory.java rename to chapter4,5/seungwon/abstractFactoryPattern/factory/WinFactory.java