From 0880ab484b9c9018e49312c98f899f9a7fc52702 Mon Sep 17 00:00:00 2001 From: wonu606 Date: Thu, 22 Jun 2023 14:20:10 +0900 Subject: [PATCH 01/12] =?UTF-8?q?feat:=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 버튼, 체크박스 인터페이스 구현 및 버튼 체크박스를 생성하는 팩토리 인터페이스 구현 --- .../src/Checkbox/Checkbox.java | 6 ++++++ AbstractFactory-And-Singleton/src/button/Button.java | 5 +++++ .../src/factory/GUIFactory.java | 11 +++++++++++ 3 files changed, 22 insertions(+) create mode 100644 AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java create mode 100644 AbstractFactory-And-Singleton/src/button/Button.java create mode 100644 AbstractFactory-And-Singleton/src/factory/GUIFactory.java diff --git a/AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java b/AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java new file mode 100644 index 0000000..969f2c3 --- /dev/null +++ b/AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java @@ -0,0 +1,6 @@ +package Checkbox; + +public interface Checkbox { + + void paint(); +} diff --git a/AbstractFactory-And-Singleton/src/button/Button.java b/AbstractFactory-And-Singleton/src/button/Button.java new file mode 100644 index 0000000..79ca518 --- /dev/null +++ b/AbstractFactory-And-Singleton/src/button/Button.java @@ -0,0 +1,5 @@ +package button; + +public interface Button { + void paint(); +} diff --git a/AbstractFactory-And-Singleton/src/factory/GUIFactory.java b/AbstractFactory-And-Singleton/src/factory/GUIFactory.java new file mode 100644 index 0000000..280806b --- /dev/null +++ b/AbstractFactory-And-Singleton/src/factory/GUIFactory.java @@ -0,0 +1,11 @@ +package factory; + +import Checkbox.Checkbox; +import button.Button; + +public interface GUIFactory { + + Button createButton(); + + Checkbox createCheckbox(); +} From aa5b93f56e44723a760a8a8749d1c3c11d94fb8e Mon Sep 17 00:00:00 2001 From: wonu606 Date: Thu, 22 Jun 2023 14:25:19 +0900 Subject: [PATCH 02/12] =?UTF-8?q?feat:=20GUI=ED=8C=A9=ED=86=A0=EB=A6=AC=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EC=B2=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 맥, 윈도우 GUI팩토리 구현체 구현 --- .../src/factory/MaxOSFactory.java | 17 +++++++++++++++++ .../src/factory/WindowsFactory.java | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java create mode 100644 AbstractFactory-And-Singleton/src/factory/WindowsFactory.java diff --git a/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java b/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java new file mode 100644 index 0000000..9e57a71 --- /dev/null +++ b/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java @@ -0,0 +1,17 @@ +package factory; + +import Checkbox.Checkbox; +import button.Button; + +public class MaxOSFactory implements GUIFactory { + + @Override + public Button createButton() { + return new MacOSButton(); + } + + @Override + public Checkbox createCheckbox() { + return new MacOSCheckbox(); + } +} diff --git a/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java b/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java new file mode 100644 index 0000000..bcad41b --- /dev/null +++ b/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java @@ -0,0 +1,17 @@ +package factory; + +import Checkbox.Checkbox; +import button.Button; + +public class WindowsFactory implements GUIFactory { + + @Override + public Button createButton() { + return new WindowButton(); + } + + @Override + public Checkbox createCheckbox() { + return new WindowCheckbox(); + } +} From 4ea769f82a1bea4c27ea449fee21074b20832eec Mon Sep 17 00:00:00 2001 From: wonu606 Date: Thu, 22 Jun 2023 14:33:55 +0900 Subject: [PATCH 03/12] =?UTF-8?q?feat:=20=EB=A7=A5=20=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=A0=9C=ED=92=88=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java | 2 +- .../src/Checkbox/MaxOSCheckbox.java | 9 +++++++++ .../src/button/MacOSButton.java | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 AbstractFactory-And-Singleton/src/Checkbox/MaxOSCheckbox.java create mode 100644 AbstractFactory-And-Singleton/src/button/MacOSButton.java diff --git a/AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java b/AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java index 969f2c3..2cfd85e 100644 --- a/AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java +++ b/AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java @@ -1,4 +1,4 @@ -package Checkbox; +package checkbox; public interface Checkbox { diff --git a/AbstractFactory-And-Singleton/src/Checkbox/MaxOSCheckbox.java b/AbstractFactory-And-Singleton/src/Checkbox/MaxOSCheckbox.java new file mode 100644 index 0000000..0fb721f --- /dev/null +++ b/AbstractFactory-And-Singleton/src/Checkbox/MaxOSCheckbox.java @@ -0,0 +1,9 @@ +package checkbox; + +public class MaxOSCheckbox implements Checkbox { + + @Override + public void paint() { + System.out.println("[맥 체크박스] 생성됨"); + } +} diff --git a/AbstractFactory-And-Singleton/src/button/MacOSButton.java b/AbstractFactory-And-Singleton/src/button/MacOSButton.java new file mode 100644 index 0000000..fd76b8c --- /dev/null +++ b/AbstractFactory-And-Singleton/src/button/MacOSButton.java @@ -0,0 +1,9 @@ +package button; + +public class MacOSButton implements Button { + + @Override + public void paint() { + System.out.println("[맥 마우스] 생성됨"); + } +} From 2d76ac7384c64e322ac3a8ed274c9b3566d38f0c Mon Sep 17 00:00:00 2001 From: wonu606 Date: Thu, 22 Jun 2023 14:43:04 +0900 Subject: [PATCH 04/12] =?UTF-8?q?chore:=20Checkbox=20=EB=94=94=EB=A0=89?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=EB=AA=85=20=EC=95=9E=EB=8C=80=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=20->=20=EC=86=8C=EB=AC=B8=EC=9E=90=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/{Checkbox => checkbox}/Checkbox.java | 0 .../src/{Checkbox => checkbox}/MaxOSCheckbox.java | 0 AbstractFactory-And-Singleton/src/factory/GUIFactory.java | 2 +- AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java | 2 +- AbstractFactory-And-Singleton/src/factory/WindowsFactory.java | 2 +- 5 files changed, 3 insertions(+), 3 deletions(-) rename AbstractFactory-And-Singleton/src/{Checkbox => checkbox}/Checkbox.java (100%) rename AbstractFactory-And-Singleton/src/{Checkbox => checkbox}/MaxOSCheckbox.java (100%) diff --git a/AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java b/AbstractFactory-And-Singleton/src/checkbox/Checkbox.java similarity index 100% rename from AbstractFactory-And-Singleton/src/Checkbox/Checkbox.java rename to AbstractFactory-And-Singleton/src/checkbox/Checkbox.java diff --git a/AbstractFactory-And-Singleton/src/Checkbox/MaxOSCheckbox.java b/AbstractFactory-And-Singleton/src/checkbox/MaxOSCheckbox.java similarity index 100% rename from AbstractFactory-And-Singleton/src/Checkbox/MaxOSCheckbox.java rename to AbstractFactory-And-Singleton/src/checkbox/MaxOSCheckbox.java diff --git a/AbstractFactory-And-Singleton/src/factory/GUIFactory.java b/AbstractFactory-And-Singleton/src/factory/GUIFactory.java index 280806b..e7aaa39 100644 --- a/AbstractFactory-And-Singleton/src/factory/GUIFactory.java +++ b/AbstractFactory-And-Singleton/src/factory/GUIFactory.java @@ -1,6 +1,6 @@ package factory; -import Checkbox.Checkbox; +import checkbox.Checkbox; import button.Button; public interface GUIFactory { diff --git a/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java b/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java index 9e57a71..94b2e16 100644 --- a/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java +++ b/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java @@ -1,6 +1,6 @@ package factory; -import Checkbox.Checkbox; +import checkbox.Checkbox; import button.Button; public class MaxOSFactory implements GUIFactory { diff --git a/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java b/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java index bcad41b..4407959 100644 --- a/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java +++ b/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java @@ -1,6 +1,6 @@ package factory; -import Checkbox.Checkbox; +import checkbox.Checkbox; import button.Button; public class WindowsFactory implements GUIFactory { From 2339e2f0bda0d0834ce38a0a68264de37f57b06f Mon Sep 17 00:00:00 2001 From: wonu606 Date: Thu, 22 Jun 2023 14:45:56 +0900 Subject: [PATCH 05/12] =?UTF-8?q?feat:=20=EC=9C=88=EB=8F=84=EC=9A=B0=20?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EC=A0=9C=ED=92=88=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/button/WindowButton.java | 9 +++++++++ .../src/checkbox/WindowCheckbox.java | 9 +++++++++ .../src/factory/WindowsFactory.java | 2 ++ 3 files changed, 20 insertions(+) create mode 100644 AbstractFactory-And-Singleton/src/button/WindowButton.java create mode 100644 AbstractFactory-And-Singleton/src/checkbox/WindowCheckbox.java diff --git a/AbstractFactory-And-Singleton/src/button/WindowButton.java b/AbstractFactory-And-Singleton/src/button/WindowButton.java new file mode 100644 index 0000000..36a3481 --- /dev/null +++ b/AbstractFactory-And-Singleton/src/button/WindowButton.java @@ -0,0 +1,9 @@ +package button; + +public class WindowButton implements Button { + + @Override + public void paint() { + System.out.println("[윈도우 버튼] 생성됨"); + } +} diff --git a/AbstractFactory-And-Singleton/src/checkbox/WindowCheckbox.java b/AbstractFactory-And-Singleton/src/checkbox/WindowCheckbox.java new file mode 100644 index 0000000..622e916 --- /dev/null +++ b/AbstractFactory-And-Singleton/src/checkbox/WindowCheckbox.java @@ -0,0 +1,9 @@ +package checkbox; + +public class WindowCheckbox implements Checkbox { + + @Override + public void paint() { + System.out.println("[윈도우 체크박스] 생성됨"); + } +} diff --git a/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java b/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java index 4407959..fbda283 100644 --- a/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java +++ b/AbstractFactory-And-Singleton/src/factory/WindowsFactory.java @@ -1,7 +1,9 @@ package factory; +import button.WindowButton; import checkbox.Checkbox; import button.Button; +import checkbox.WindowCheckbox; public class WindowsFactory implements GUIFactory { From ae8b2c6a5214e6844f29eeaf04993caa1b9d96ce Mon Sep 17 00:00:00 2001 From: wonu606 Date: Thu, 22 Jun 2023 14:47:02 +0900 Subject: [PATCH 06/12] =?UTF-8?q?fix:=20=EB=A7=A5=20=EC=B2=B4=ED=81=AC?= =?UTF-8?q?=EB=B0=95=EC=8A=A4=EB=AA=85=EC=9D=B4=20=EC=9E=98=EB=AA=BB?= =?UTF-8?q?=EB=90=98=EC=96=B4=20=EC=9E=88=EC=96=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/checkbox/{MaxOSCheckbox.java => MacOSCheckbox.java} | 2 +- AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) rename AbstractFactory-And-Singleton/src/checkbox/{MaxOSCheckbox.java => MacOSCheckbox.java} (72%) diff --git a/AbstractFactory-And-Singleton/src/checkbox/MaxOSCheckbox.java b/AbstractFactory-And-Singleton/src/checkbox/MacOSCheckbox.java similarity index 72% rename from AbstractFactory-And-Singleton/src/checkbox/MaxOSCheckbox.java rename to AbstractFactory-And-Singleton/src/checkbox/MacOSCheckbox.java index 0fb721f..8387814 100644 --- a/AbstractFactory-And-Singleton/src/checkbox/MaxOSCheckbox.java +++ b/AbstractFactory-And-Singleton/src/checkbox/MacOSCheckbox.java @@ -1,6 +1,6 @@ package checkbox; -public class MaxOSCheckbox implements Checkbox { +public class MacOSCheckbox implements Checkbox { @Override public void paint() { diff --git a/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java b/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java index 94b2e16..142e340 100644 --- a/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java +++ b/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java @@ -1,7 +1,9 @@ package factory; +import button.MacOSButton; import checkbox.Checkbox; import button.Button; +import checkbox.MacOSCheckbox; public class MaxOSFactory implements GUIFactory { From c1e8be93126f58e60bee44a25f85981d1c3fb2f5 Mon Sep 17 00:00:00 2001 From: wonu606 Date: Thu, 22 Jun 2023 14:49:22 +0900 Subject: [PATCH 07/12] =?UTF-8?q?chore:=20=EB=A7=A5=20=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=EB=AA=85=EC=9D=B4=20=EC=9E=98=EB=AA=BB=EB=90=98?= =?UTF-8?q?=EC=96=B4=20=EC=9E=88=EC=96=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/factory/{MaxOSFactory.java => MacOSFactory.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename AbstractFactory-And-Singleton/src/factory/{MaxOSFactory.java => MacOSFactory.java} (86%) diff --git a/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java b/AbstractFactory-And-Singleton/src/factory/MacOSFactory.java similarity index 86% rename from AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java rename to AbstractFactory-And-Singleton/src/factory/MacOSFactory.java index 142e340..2cea052 100644 --- a/AbstractFactory-And-Singleton/src/factory/MaxOSFactory.java +++ b/AbstractFactory-And-Singleton/src/factory/MacOSFactory.java @@ -5,7 +5,7 @@ import button.Button; import checkbox.MacOSCheckbox; -public class MaxOSFactory implements GUIFactory { +public class MacOSFactory implements GUIFactory { @Override public Button createButton() { From ca0e05dea4d909c13378d5736bed5266f1ed2d5b Mon Sep 17 00:00:00 2001 From: wonu606 Date: Thu, 22 Jun 2023 14:59:44 +0900 Subject: [PATCH 08/12] =?UTF-8?q?feat:=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AbstractFactory-And-Singleton/src/App.java | 19 +++++++++ AbstractFactory-And-Singleton/src/Main.java | 44 +++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 AbstractFactory-And-Singleton/src/App.java create mode 100644 AbstractFactory-And-Singleton/src/Main.java diff --git a/AbstractFactory-And-Singleton/src/App.java b/AbstractFactory-And-Singleton/src/App.java new file mode 100644 index 0000000..a13f163 --- /dev/null +++ b/AbstractFactory-And-Singleton/src/App.java @@ -0,0 +1,19 @@ +import button.Button; +import checkbox.Checkbox; +import factory.GUIFactory; + +public class App { + + private Button button; + private Checkbox checkbox; + + public App(GUIFactory factory) { + this.button = factory.createButton(); + this.checkbox = factory.createCheckbox(); + } + + public void paint() { + button.paint(); + checkbox.paint(); + } +} diff --git a/AbstractFactory-And-Singleton/src/Main.java b/AbstractFactory-And-Singleton/src/Main.java new file mode 100644 index 0000000..cce890a --- /dev/null +++ b/AbstractFactory-And-Singleton/src/Main.java @@ -0,0 +1,44 @@ +import factory.GUIFactory; +import factory.MacOSFactory; +import factory.WindowsFactory; +import java.util.Scanner; + +public class Main { + + private static GUIFactory macOSFactory = new MacOSFactory(); + private static GUIFactory windowsFactory = new WindowsFactory(); + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + String osKorean = scanner.nextLine(); + GUIFactory guiFactory = getOS(osKorean); + if (!validOS(guiFactory)) { + return; + } + + App app = new App(guiFactory); + app.paint(); + + scanner.close(); + } + + private static boolean validOS(GUIFactory guiFactory) { + if (guiFactory == null) { + System.out.println("그런 OS는 존재하지 않습니다."); + return false; + } + return true; + } + + private static GUIFactory getOS(String osKorean) { + switch (osKorean) { + case "맥": + return macOSFactory; + case "윈도우": + return windowsFactory; + default: + return null; + } + } +} \ No newline at end of file From 3a0a2b4d25eaeb5c01433138f7ce53c9383c04e1 Mon Sep 17 00:00:00 2001 From: wonu606 Date: Fri, 30 Jun 2023 13:33:39 +0900 Subject: [PATCH 09/12] =?UTF-8?q?=EC=BB=A4=EB=A7=A8=EB=93=9C=20=ED=8C=A8?= =?UTF-8?q?=ED=84=B4=EC=9D=84=20=EC=9D=B4=EC=9A=A9=ED=95=9C=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=97=90=EB=94=94=ED=84=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- commandpattern/src/Command.java | 22 ++++++++++ commandpattern/src/CommandHistory.java | 22 ++++++++++ commandpattern/src/CopyCommand.java | 28 ++++++++++++ commandpattern/src/CutCommand.java | 34 +++++++++++++++ commandpattern/src/Editor.java | 59 ++++++++++++++++++++++++++ commandpattern/src/Main.java | 8 ++++ commandpattern/src/PasteCommand.java | 30 +++++++++++++ 7 files changed, 203 insertions(+) create mode 100644 commandpattern/src/Command.java create mode 100644 commandpattern/src/CommandHistory.java create mode 100644 commandpattern/src/CopyCommand.java create mode 100644 commandpattern/src/CutCommand.java create mode 100644 commandpattern/src/Editor.java create mode 100644 commandpattern/src/Main.java create mode 100644 commandpattern/src/PasteCommand.java diff --git a/commandpattern/src/Command.java b/commandpattern/src/Command.java new file mode 100644 index 0000000..0a485e5 --- /dev/null +++ b/commandpattern/src/Command.java @@ -0,0 +1,22 @@ +public abstract class Command { + + protected String name = "abstract"; + protected final Editor editor; + protected String backup; + + public Command(Editor editor) { + this.editor = editor; + } + + public String getName() { + return name; + } + + public abstract boolean execute(); + + public abstract void undo(); + + protected void backup() { + backup = editor.text.toString(); + } +} diff --git a/commandpattern/src/CommandHistory.java b/commandpattern/src/CommandHistory.java new file mode 100644 index 0000000..3736577 --- /dev/null +++ b/commandpattern/src/CommandHistory.java @@ -0,0 +1,22 @@ +import java.util.Stack; + +public class CommandHistory { + + private final Stack history = new Stack<>(); + + public void push(Command command) { + history.push(command); + } + + public Command pop() { + return history.pop(); + } + + public Command peek() { + return history.peek(); + } + + public boolean isEmpty() { + return history.isEmpty(); + } +} diff --git a/commandpattern/src/CopyCommand.java b/commandpattern/src/CopyCommand.java new file mode 100644 index 0000000..a7ec8e8 --- /dev/null +++ b/commandpattern/src/CopyCommand.java @@ -0,0 +1,28 @@ +import java.util.Scanner; + +public class CopyCommand extends Command { + + public CopyCommand(Editor editor) { + super(editor); + } + + @Override + public boolean execute() { + System.out.println("카피를 시작합니다."); + Scanner scanner = new Scanner(System.in); + + System.out.print("Start Index: "); + int start = scanner.nextInt(); + + System.out.print("End Index: "); + int end = scanner.nextInt(); + + editor.clipboard = editor.text.substring(start, end); + return false; + } + + @Override + public void undo() { + throw new UnsupportedOperationException(); + } +} diff --git a/commandpattern/src/CutCommand.java b/commandpattern/src/CutCommand.java new file mode 100644 index 0000000..4811bec --- /dev/null +++ b/commandpattern/src/CutCommand.java @@ -0,0 +1,34 @@ +import java.util.Scanner; +import javax.print.AttributeException; + +public class CutCommand extends Command{ + + public CutCommand(Editor editor) { + super(editor); + } + + @Override + public boolean execute() { + System.out.println("자를 문자열의 인덱스를 입력해주세요."); + Scanner scanner = new Scanner(System.in); + + System.out.print("Start Index: "); + int start = scanner.nextInt(); + + System.out.print("End Index: "); + int end = scanner.nextInt(); + if (start >= end) { + return false; + } + + backup(); + editor.clipboard = editor.text.substring(start, end); + editor.text.delete(start, end); + return true; + } + + @Override + public void undo() { + editor.text = new StringBuilder(backup); + } +} diff --git a/commandpattern/src/Editor.java b/commandpattern/src/Editor.java new file mode 100644 index 0000000..0248e73 --- /dev/null +++ b/commandpattern/src/Editor.java @@ -0,0 +1,59 @@ +import java.util.Scanner; + +public class Editor { + + public StringBuilder text = new StringBuilder(); + public String clipboard; + public final CommandHistory history = new CommandHistory(); + + public void start() { + Scanner scanner = new Scanner(System.in); + while (true) { + System.out.print("커맨드를 입력해주세요: "); + String command = scanner.nextLine(); + + switch (command) { + case "input": + text.append(scanner.nextLine()); + break; + + case "copy": + executeCommand(new CopyCommand(this)); + break; + + case "cut": + executeCommand(new CutCommand(this)); + break; + + case "paste": + executeCommand(new PasteCommand(this)); + break; + + case "undo": + undo(); + break; + + case "exit": + System.exit(0); + } + System.out.println(text.toString()); + } + } + + private void undo() { + if (history.isEmpty()) { + return; + } + + Command command = history.pop(); + if (command != null) { + command.undo(); + } + } + + private void executeCommand(Command command) { + if (command.execute()) { + history.push(command); + } + } +} diff --git a/commandpattern/src/Main.java b/commandpattern/src/Main.java new file mode 100644 index 0000000..6a6e30e --- /dev/null +++ b/commandpattern/src/Main.java @@ -0,0 +1,8 @@ +public class Main { + + public static void main(String[] args) { + Editor editor = new Editor(); + + editor.start(); + } +} \ No newline at end of file diff --git a/commandpattern/src/PasteCommand.java b/commandpattern/src/PasteCommand.java new file mode 100644 index 0000000..0efcb03 --- /dev/null +++ b/commandpattern/src/PasteCommand.java @@ -0,0 +1,30 @@ +import java.util.Scanner; + +public class PasteCommand extends Command{ + + public PasteCommand(Editor editor) { + super(editor); + } + + @Override + public boolean execute() { + if (editor.clipboard == null) { + return false; + } + + backup(); + System.out.println("붙여 넣을 시작 인덱스를 입력해주세요."); + Scanner scanner = new Scanner(System.in); + + System.out.print("Start Index: "); + int start = scanner.nextInt(); + + editor.text.insert(start, editor.clipboard); + return true; + } + + @Override + public void undo() { + editor.text = new StringBuilder(backup); + } +} From 2a9ce3c5638c1e3f01dcea31fd4dd051f8b67c1c Mon Sep 17 00:00:00 2001 From: wonu606 Date: Fri, 30 Jun 2023 19:38:29 +0900 Subject: [PATCH 10/12] =?UTF-8?q?=EC=96=B4=EB=8C=91=ED=84=B0=20=ED=8C=A8?= =?UTF-8?q?=ED=84=B4=EC=9D=84=20=EC=9D=B4=EC=9A=A9=ED=95=9C=20=EB=AF=B8?= =?UTF-8?q?=EB=8B=88=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Adapterpattern/src/Main.java | 24 ++++++++++++++++++++++++ Adapterpattern/src/RoundHole.java | 15 +++++++++++++++ Adapterpattern/src/RoundPeg.java | 15 +++++++++++++++ Adapterpattern/src/SquarePeg.java | 15 +++++++++++++++ Adapterpattern/src/SquarePegAdapter.java | 14 ++++++++++++++ 5 files changed, 83 insertions(+) create mode 100644 Adapterpattern/src/Main.java create mode 100644 Adapterpattern/src/RoundHole.java create mode 100644 Adapterpattern/src/RoundPeg.java create mode 100644 Adapterpattern/src/SquarePeg.java create mode 100644 Adapterpattern/src/SquarePegAdapter.java diff --git a/Adapterpattern/src/Main.java b/Adapterpattern/src/Main.java new file mode 100644 index 0000000..0415d7d --- /dev/null +++ b/Adapterpattern/src/Main.java @@ -0,0 +1,24 @@ +public class Main { + + public static void main(String[] args) { + RoundHole roundHole = new RoundHole(5); + RoundPeg roundPeg = new RoundPeg(5); + if (roundHole.fits(roundPeg)) { + System.out.println("roundPeg가 들어갈 수 있습니다."); + } + + SquarePeg smallSqPeg = new SquarePeg(2); + SquarePeg largeSqPeg = new SquarePeg(20); + + SquarePegAdapter smallPeg = new SquarePegAdapter(smallSqPeg); + SquarePegAdapter largePeg = new SquarePegAdapter(largeSqPeg); +// roundHole.fits(smallSqPeg); +// roundHole.fits(largeSqPeg); + if (roundHole.fits(smallPeg)) { + System.out.println("smallPeg가 들어갈 수 있습니다."); + } + if (roundHole.fits(largePeg)) { + System.out.println("largePeg가 들어갈 수 있습니다."); + } + } +} \ No newline at end of file diff --git a/Adapterpattern/src/RoundHole.java b/Adapterpattern/src/RoundHole.java new file mode 100644 index 0000000..e4db28c --- /dev/null +++ b/Adapterpattern/src/RoundHole.java @@ -0,0 +1,15 @@ +public class RoundHole { + private double radius; + + public RoundHole(double radius) { + this.radius = radius; + } + + public double getRadius() { + return radius; + } + + public boolean fits(RoundPeg peg) { + return radius >= peg.getRadius(); + } +} diff --git a/Adapterpattern/src/RoundPeg.java b/Adapterpattern/src/RoundPeg.java new file mode 100644 index 0000000..3b2887e --- /dev/null +++ b/Adapterpattern/src/RoundPeg.java @@ -0,0 +1,15 @@ +public class RoundPeg { + + private double radius; + + public RoundPeg() { + } + + public RoundPeg(double radius) { + this.radius = radius; + } + + public double getRadius() { + return radius; + } +} diff --git a/Adapterpattern/src/SquarePeg.java b/Adapterpattern/src/SquarePeg.java new file mode 100644 index 0000000..74ec348 --- /dev/null +++ b/Adapterpattern/src/SquarePeg.java @@ -0,0 +1,15 @@ +public class SquarePeg { + private double width; + + public SquarePeg(double width) { + this.width = width; + } + + public double getWidth() { + return width; + } + + public double getSquare() { + return Math.pow(width, 2); + } +} diff --git a/Adapterpattern/src/SquarePegAdapter.java b/Adapterpattern/src/SquarePegAdapter.java new file mode 100644 index 0000000..dda672d --- /dev/null +++ b/Adapterpattern/src/SquarePegAdapter.java @@ -0,0 +1,14 @@ +public class SquarePegAdapter extends RoundPeg { + + private SquarePeg peg; + + public SquarePegAdapter(SquarePeg peg) { + this.peg = peg; + } + + @Override + public double getRadius() { + return Math.sqrt( + Math.pow(peg.getWidth() / 2, 2) * 2); + } +} From 9b293fe0696923627ce58103e69826c536c8a590 Mon Sep 17 00:00:00 2001 From: wonu606 Date: Thu, 13 Jul 2023 23:29:48 +0900 Subject: [PATCH 11/12] =?UTF-8?q?feat:=20=ED=85=9C=ED=94=8C=EB=A6=BF=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C,=20=EB=B0=98=EB=B3=B5=EC=9E=90,=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EC=A7=80=ED=8A=B8=20=ED=8C=A8=ED=84=B4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- compositepattern/src/Demo.java | 28 ++++++++ compositepattern/src/editor/ImageEditor.java | 18 +++++ compositepattern/src/shapes/BaseShape.java | 39 +++++++++++ compositepattern/src/shapes/Circle.java | 21 ++++++ .../src/shapes/CompoundShape.java | 52 ++++++++++++++ compositepattern/src/shapes/Dot.java | 23 +++++++ compositepattern/src/shapes/Rectangle.java | 23 +++++++ compositepattern/src/shapes/Shape.java | 12 ++++ iteratorpattern/src/Demo.java | 50 ++++++++++++++ .../src/iterators/FacebookIterator.java | 68 +++++++++++++++++++ .../src/iterators/LinkedInIterator.java | 68 +++++++++++++++++++ .../src/iterators/ProfileIterator.java | 12 ++++ iteratorpattern/src/profile/Profile.java | 57 ++++++++++++++++ .../src/social_networks/Facebook.java | 63 +++++++++++++++++ .../src/social_networks/LinkedIn.java | 63 +++++++++++++++++ .../src/social_networks/SocialNetwork.java | 9 +++ .../src/spammer/SocialSpammer.java | 35 ++++++++++ templatemethodpattern/src/Demo.java | 40 +++++++++++ .../src/networks/FaceBook.java | 42 ++++++++++++ .../src/networks/Network.java | 19 ++++++ .../src/networks/Twitter.java | 42 ++++++++++++ 21 files changed, 784 insertions(+) create mode 100644 compositepattern/src/Demo.java create mode 100644 compositepattern/src/editor/ImageEditor.java create mode 100644 compositepattern/src/shapes/BaseShape.java create mode 100644 compositepattern/src/shapes/Circle.java create mode 100644 compositepattern/src/shapes/CompoundShape.java create mode 100644 compositepattern/src/shapes/Dot.java create mode 100644 compositepattern/src/shapes/Rectangle.java create mode 100644 compositepattern/src/shapes/Shape.java create mode 100644 iteratorpattern/src/Demo.java create mode 100644 iteratorpattern/src/iterators/FacebookIterator.java create mode 100644 iteratorpattern/src/iterators/LinkedInIterator.java create mode 100644 iteratorpattern/src/iterators/ProfileIterator.java create mode 100644 iteratorpattern/src/profile/Profile.java create mode 100644 iteratorpattern/src/social_networks/Facebook.java create mode 100644 iteratorpattern/src/social_networks/LinkedIn.java create mode 100644 iteratorpattern/src/social_networks/SocialNetwork.java create mode 100644 iteratorpattern/src/spammer/SocialSpammer.java create mode 100644 templatemethodpattern/src/Demo.java create mode 100644 templatemethodpattern/src/networks/FaceBook.java create mode 100644 templatemethodpattern/src/networks/Network.java create mode 100644 templatemethodpattern/src/networks/Twitter.java diff --git a/compositepattern/src/Demo.java b/compositepattern/src/Demo.java new file mode 100644 index 0000000..8d1ac11 --- /dev/null +++ b/compositepattern/src/Demo.java @@ -0,0 +1,28 @@ +import editor.ImageEditor; +import shapes.Circle; +import shapes.CompoundShape; +import shapes.Dot; +import shapes.Rectangle; + +public class Demo { + public static void main(String[] args) { + ImageEditor editor = new ImageEditor(); + + editor.loadShapes( + new Circle(10, 10, 10), + + new CompoundShape( + new Circle(110, 110, 50), + new Dot(160, 160) + ), + + new CompoundShape( + new Rectangle(250, 250, 100, 100), + new Dot(240, 240), + new Dot(240, 360), + new Dot(360, 360), + new Dot(360, 240) + ) + ); + } +} diff --git a/compositepattern/src/editor/ImageEditor.java b/compositepattern/src/editor/ImageEditor.java new file mode 100644 index 0000000..271c637 --- /dev/null +++ b/compositepattern/src/editor/ImageEditor.java @@ -0,0 +1,18 @@ +package editor; + +import shapes.BaseShape; +import shapes.CompoundShape; + +public class ImageEditor { + private CompoundShape allShapes = new CompoundShape(); + + public void loadShapes(BaseShape... shapes) { + allShapes.clear(); + allShapes.add(shapes); + printCanvas(); + } + + private void printCanvas() { + allShapes.print(); + } +} diff --git a/compositepattern/src/shapes/BaseShape.java b/compositepattern/src/shapes/BaseShape.java new file mode 100644 index 0000000..978ae75 --- /dev/null +++ b/compositepattern/src/shapes/BaseShape.java @@ -0,0 +1,39 @@ +package shapes; + +import java.awt.Graphics; + +public abstract class BaseShape implements Shape { + + private int x; + private int y; + + BaseShape(int x, int y) { + this.x = x; + this.y = y; + + } + + @Override + public int getX() { + return x; + } + + @Override + public int getY() { + return y; + } + + public void print() { + System.out.println(this.getClass().getSimpleName() + ": Position -> (" + getX() + "," + getY() + "), Dimensions -> (" + getWidth() + "," + getHeight() + ")"); + } + protected void print(int depth) { + printTab(depth); + print(); + } + + protected void printTab(int depth) { + for(int i = 0; i < depth; i++) { + System.out.print("\t"); + } + } +} diff --git a/compositepattern/src/shapes/Circle.java b/compositepattern/src/shapes/Circle.java new file mode 100644 index 0000000..1ec80ff --- /dev/null +++ b/compositepattern/src/shapes/Circle.java @@ -0,0 +1,21 @@ +package shapes; + +public class Circle extends BaseShape{ + + private final int radius; + + public Circle(int x, int y, int radius) { + super(x, y); + this.radius = radius; + } + + @Override + public int getWidth() { + return radius * 2; + } + + @Override + public int getHeight() { + return radius * 2; + } +} diff --git a/compositepattern/src/shapes/CompoundShape.java b/compositepattern/src/shapes/CompoundShape.java new file mode 100644 index 0000000..8f415da --- /dev/null +++ b/compositepattern/src/shapes/CompoundShape.java @@ -0,0 +1,52 @@ +package shapes; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class CompoundShape extends BaseShape { + protected final List children; + + public CompoundShape() { + super(0, 0); + children = new ArrayList<>(); + } + + public CompoundShape(BaseShape... components) { + super(0, 0); + children = new ArrayList<>(); + add(components); + } + + @Override + public int getWidth() { + return 0; + } + + @Override + public int getHeight() { + return 0; + } + + @Override + public void print() { + print(0); + } + + public void add(BaseShape... components) { + children.addAll(Arrays.asList(components)); + } + + public void clear() { + children.clear(); + } + + @Override + protected void print(int depth) { + printTab(depth); + System.out.println("CompoundShape"); + for (BaseShape child : children) { + child.print(depth + 1); + } + } +} diff --git a/compositepattern/src/shapes/Dot.java b/compositepattern/src/shapes/Dot.java new file mode 100644 index 0000000..6b56ae3 --- /dev/null +++ b/compositepattern/src/shapes/Dot.java @@ -0,0 +1,23 @@ +package shapes; + +import java.awt.Color; +import java.awt.Graphics; + +public class Dot extends BaseShape { + + private final int DOT_SIZE = 3; + + public Dot(int x, int y) { + super(x, y); + } + + @Override + public int getWidth() { + return DOT_SIZE; + } + + @Override + public int getHeight() { + return DOT_SIZE; + } +} diff --git a/compositepattern/src/shapes/Rectangle.java b/compositepattern/src/shapes/Rectangle.java new file mode 100644 index 0000000..434ee3f --- /dev/null +++ b/compositepattern/src/shapes/Rectangle.java @@ -0,0 +1,23 @@ +package shapes; + +public class Rectangle extends BaseShape{ + + private final int width; + private final int height; + + public Rectangle(int x, int y, int width, int height) { + super(x, y); + this.width = width; + this.height = height; + } + + @Override + public int getWidth() { + return width; + } + + @Override + public int getHeight() { + return height; + } +} diff --git a/compositepattern/src/shapes/Shape.java b/compositepattern/src/shapes/Shape.java new file mode 100644 index 0000000..54a7007 --- /dev/null +++ b/compositepattern/src/shapes/Shape.java @@ -0,0 +1,12 @@ +package shapes; + +import java.awt.Graphics; + +public interface Shape { + int getX(); + int getY(); + int getWidth(); + int getHeight(); + + void print(); +} diff --git a/iteratorpattern/src/Demo.java b/iteratorpattern/src/Demo.java new file mode 100644 index 0000000..f1e4ded --- /dev/null +++ b/iteratorpattern/src/Demo.java @@ -0,0 +1,50 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; +import profile.Profile; +import social_networks.Facebook; +import social_networks.LinkedIn; +import social_networks.SocialNetwork; +import spammer.SocialSpammer; + +public class Demo { + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + System.out.println("Please specify social network to target spam tool (default:Facebook):"); + System.out.println("1. Facebook"); + System.out.println("2. LinkedIn"); + String choice = scanner.nextLine(); + + SocialNetwork network = getNetwork(choice); + + SocialSpammer spammer = new SocialSpammer(network); + spammer.sendSpamToFriends("anna.smith@bing.com", + "Hey! This is Anna's friend Josh. Can you do me a favor and like this post [link]?"); + spammer.sendSpamToCoworkers("anna.smith@bing.com", + "Hey! This is Anna's boss Jason. Anna told me you would be interested in [link]."); + } + + private static SocialNetwork getNetwork(String choice) { + switch (choice) { + case "1": + return new Facebook(generateTestProfiles()); + case "2": + return new LinkedIn(generateTestProfiles()); + default: + throw new IllegalArgumentException("구현되지 않은 메뉴입니다: " + choice); + } + } + + private static List generateTestProfiles() { + List data = new ArrayList<>(); + data.add(new Profile("anna.smith@bing.com", "Anna Smith", "friends:mad_max@ya.com", "friends:catwoman@yahoo.com", "coworkers:sam@amazon.com")); + data.add(new Profile("mad_max@ya.com", "Maximilian", "friends:anna.smith@bing.com", "coworkers:sam@amazon.com")); + data.add(new Profile("bill@microsoft.eu", "Billie", "coworkers:avanger@ukr.net")); + data.add(new Profile("avanger@ukr.net", "John Day", "coworkers:bill@microsoft.eu")); + data.add(new Profile("sam@amazon.com", "Sam Kitting", "coworkers:anna.smith@bing.com", "coworkers:mad_max@ya.com", "friends:catwoman@yahoo.com")); + data.add(new Profile("catwoman@yahoo.com", "Liza", "friends:anna.smith@bing.com", "friends:sam@amazon.com")); + return data; + } +} diff --git a/iteratorpattern/src/iterators/FacebookIterator.java b/iteratorpattern/src/iterators/FacebookIterator.java new file mode 100644 index 0000000..181d69a --- /dev/null +++ b/iteratorpattern/src/iterators/FacebookIterator.java @@ -0,0 +1,68 @@ +package iterators; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import profile.Profile; +import social_networks.Facebook; + +public class FacebookIterator implements ProfileIterator { + + private final Facebook facebook; + private final String type; + private final String email; + private List emails; + private List profiles; + + private int currentPosition; + + public FacebookIterator(Facebook facebook, String type, String email) { + this.facebook = facebook; + this.type = type; + this.email = email; + + emails = Collections.emptyList(); + profiles = Collections.emptyList(); + + currentPosition = 0; + } + + @Override + public boolean hasNext() { + lazyLoad(); + return currentPosition < emails.size(); + } + + @Override + public Profile getNext() { + if (!hasNext()) { + return null; + } + + String obtainedEmail = emails.get(currentPosition); + Profile obtainedProfile = profiles.get(currentPosition); + if (obtainedProfile == null) { + obtainedProfile = facebook.requestProfile(obtainedEmail); + profiles.set(currentPosition, obtainedProfile); + } + currentPosition++; + return obtainedProfile; + } + + @Override + public void reset() { + currentPosition = 0; + } + + private void lazyLoad() { + if (emails == Collections.EMPTY_LIST) { + emails = new ArrayList<>(); + profiles = new ArrayList<>(); + List requestedProfiles = facebook.requestProfiles(this.email, this.type); + for (String requestedProfile : requestedProfiles) { + emails.add(requestedProfile); + profiles.add(null); + } + } + } +} diff --git a/iteratorpattern/src/iterators/LinkedInIterator.java b/iteratorpattern/src/iterators/LinkedInIterator.java new file mode 100644 index 0000000..53a0186 --- /dev/null +++ b/iteratorpattern/src/iterators/LinkedInIterator.java @@ -0,0 +1,68 @@ +package iterators; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import profile.Profile; +import social_networks.Facebook; +import social_networks.LinkedIn; + +public class LinkedInIterator implements ProfileIterator { + + private final LinkedIn linkedIn; + private final String type; + private final String email; + private List emails; + private List profiles; + + private int currentPosition; + public LinkedInIterator(LinkedIn linkedIn, String type, String email) { + this.linkedIn = linkedIn; + this.type = type; + this.email = email; + + emails = Collections.emptyList(); + profiles = Collections.emptyList(); + + currentPosition = 0; + } + + @Override + public boolean hasNext() { + lazyLoad(); + return currentPosition < emails.size(); + } + + @Override + public Profile getNext() { + if (!hasNext()) { + return null; + } + + String obtainedEmail = emails.get(currentPosition); + Profile obtainedProfile = profiles.get(currentPosition); + if (obtainedProfile == null) { + obtainedProfile = linkedIn.requestProfile(obtainedEmail); + profiles.set(currentPosition, obtainedProfile); + } + currentPosition++; + return obtainedProfile; + } + + @Override + public void reset() { + currentPosition = 0; + } + + private void lazyLoad() { + if (emails == Collections.EMPTY_LIST) { + emails = new ArrayList<>(); + profiles = new ArrayList<>(); + List requestedProfiles = linkedIn.requestProfiles(this.email, this.type); + for (String requestedProfile : requestedProfiles) { + emails.add(requestedProfile); + profiles.add(null); + } + } + } +} diff --git a/iteratorpattern/src/iterators/ProfileIterator.java b/iteratorpattern/src/iterators/ProfileIterator.java new file mode 100644 index 0000000..2929634 --- /dev/null +++ b/iteratorpattern/src/iterators/ProfileIterator.java @@ -0,0 +1,12 @@ +package iterators; + +import profile.Profile; + +public interface ProfileIterator { + + boolean hasNext(); + + Profile getNext(); + + void reset(); +} diff --git a/iteratorpattern/src/profile/Profile.java b/iteratorpattern/src/profile/Profile.java new file mode 100644 index 0000000..36b76c1 --- /dev/null +++ b/iteratorpattern/src/profile/Profile.java @@ -0,0 +1,57 @@ +package profile; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Profile { + private final String name; + private final String email; + private final Map> contacts; + + public Profile(String email, String name, String... contacts) { + this.email = email; + this.name = name; + this.contacts = new HashMap<>(); + + addContacts(contacts); + } + + private void addContacts(String[] contacts) { + for (String contact : contacts) { + addContact(contact); + } + } + + private void addContact(String contact) { + String[] parts = contact.split(":"); + + String contactType = "friend"; + String contactEmail = parts[0]; + if (parts.length != 1) { + contactType = parts[0]; + contactEmail = parts[1]; + } + + if (!this.contacts.containsKey(contactType)) { + this.contacts.put(contactType, new ArrayList<>()); + } + this.contacts.get(contactType).add(contactEmail); + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + public List getContacts(String contactType) { + if (!contacts.containsKey(contactType)) { + this.contacts.put(contactType, new ArrayList<>()); + } + return contacts.get(contactType); + } +} diff --git a/iteratorpattern/src/social_networks/Facebook.java b/iteratorpattern/src/social_networks/Facebook.java new file mode 100644 index 0000000..1beb89d --- /dev/null +++ b/iteratorpattern/src/social_networks/Facebook.java @@ -0,0 +1,63 @@ +package social_networks; + +import iterators.FacebookIterator; +import iterators.ProfileIterator; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import profile.Profile; + +public class Facebook implements SocialNetwork { + + private final List profiles; + + public Facebook(List cache) { + this.profiles = Objects.requireNonNullElseGet(cache, ArrayList::new); + } + + @Override + public ProfileIterator createFriendsIterator(String profileEmail) { + return new FacebookIterator(this, "friends", profileEmail); + } + + @Override + public ProfileIterator createCoworkersIterator(String profileEmail) { + return new FacebookIterator(this, "coworkers", profileEmail); + } + + public List requestProfiles(String profileEmail, String contactType) { + simulateNetworkLatency(); + System.out.println("Facebook: Loading '" + contactType + "' list of '" + profileEmail + + "' over the network..."); + + Profile profile = findProfile(profileEmail); + if (profile != null) { + return profile.getContacts(contactType); + } + return null; + } + + public Profile requestProfile(String profileEmail) { + simulateNetworkLatency(); + System.out.println("Facebook: Loading profile '" + profileEmail + "' over the network..."); + + return findProfile(profileEmail); + } + + private void simulateNetworkLatency() { + try { + Thread.sleep(2500); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + } + + private Profile findProfile(String profileEmail) { + for (Profile profile : profiles) { + if (Objects.equals(profile.getEmail(), profileEmail)) { + return profile; + } + } + return null; + } +} diff --git a/iteratorpattern/src/social_networks/LinkedIn.java b/iteratorpattern/src/social_networks/LinkedIn.java new file mode 100644 index 0000000..801bd44 --- /dev/null +++ b/iteratorpattern/src/social_networks/LinkedIn.java @@ -0,0 +1,63 @@ +package social_networks; + +import iterators.LinkedInIterator; +import iterators.ProfileIterator; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import profile.Profile; + +public class LinkedIn implements SocialNetwork { + + private final List profiles; + + public LinkedIn(List cache) { + this.profiles = Objects.requireNonNullElseGet(cache, ArrayList::new); + } + + @Override + public ProfileIterator createFriendsIterator(String profileEmail) { + return new LinkedInIterator(this, "friends", profileEmail); + } + + @Override + public ProfileIterator createCoworkersIterator(String profileEmail) { + return new LinkedInIterator(this, "coworkers", profileEmail); + } + + public List requestProfiles(String profileEmail, String contactType) { + simulateNetworkLatency(); + System.out.println("LinkedIn: Loading '" + contactType + "' list of '" + profileEmail + + "' over the network..."); + + Profile profile = findProfile(profileEmail); + if (profile != null) { + return profile.getContacts(contactType); + } + return null; + } + + public Profile requestProfile(String profileEmail) { + simulateNetworkLatency(); + System.out.println("LinkedIn: Loading profile '" + profileEmail + "' over the network..."); + + return findProfile(profileEmail); + } + + private void simulateNetworkLatency() { + try { + Thread.sleep(2500); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + } + + private Profile findProfile(String profileEmail) { + for (Profile profile : profiles) { + if (Objects.equals(profile.getEmail(), profileEmail)) { + return profile; + } + } + return null; + } +} diff --git a/iteratorpattern/src/social_networks/SocialNetwork.java b/iteratorpattern/src/social_networks/SocialNetwork.java new file mode 100644 index 0000000..8c9e8ea --- /dev/null +++ b/iteratorpattern/src/social_networks/SocialNetwork.java @@ -0,0 +1,9 @@ +package social_networks; + +import iterators.ProfileIterator; + +public interface SocialNetwork { + + ProfileIterator createFriendsIterator(String profileEmail); + ProfileIterator createCoworkersIterator(String profileEmail); +} diff --git a/iteratorpattern/src/spammer/SocialSpammer.java b/iteratorpattern/src/spammer/SocialSpammer.java new file mode 100644 index 0000000..b7aa36a --- /dev/null +++ b/iteratorpattern/src/spammer/SocialSpammer.java @@ -0,0 +1,35 @@ +package spammer; + +import iterators.ProfileIterator; +import profile.Profile; +import social_networks.SocialNetwork; + +public class SocialSpammer { + public SocialNetwork network; + + public SocialSpammer(SocialNetwork network) { + this.network = network; + } + + public void sendSpamToFriends(String profileEmail, String message) { + System.out.println("\nIterating over friends...\n"); + ProfileIterator iterator = network.createFriendsIterator(profileEmail); + while (iterator.hasNext()) { + Profile profile = iterator.getNext(); + sendMessage(profile.getEmail(), message); + } + } + + public void sendSpamToCoworkers(String profileEmail, String message) { + System.out.println("\nIterating over coworkers...\n"); + ProfileIterator iterator = network.createCoworkersIterator(profileEmail); + while (iterator.hasNext()) { + Profile profile = iterator.getNext(); + sendMessage(profile.getEmail(), message); + } + } + + public void sendMessage(String email, String message) { + System.out.println("Sent message to: '" + email + "'. Message body: '" + message + "'"); + } +} diff --git a/templatemethodpattern/src/Demo.java b/templatemethodpattern/src/Demo.java new file mode 100644 index 0000000..de4c9ae --- /dev/null +++ b/templatemethodpattern/src/Demo.java @@ -0,0 +1,40 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import networks.FaceBook; +import networks.Network; +import networks.Twitter; + +public class Demo { + + public static void main(String[] args) throws IOException { + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + System.out.print("Input user name: "); + String userName = reader.readLine(); + System.out.print("Input password: "); + String password = reader.readLine(); + + // Enter the message. + System.out.print("Input message: "); + String message = reader.readLine(); + + System.out.println("\nChoose social network for posting message.\n" + + "1 - Facebook\n" + + "2 - Twitter"); + int choice = Integer.parseInt(reader.readLine()); + + Network network = getNetwork(choice); + network.post(message, userName, password); + } + + private static Network getNetwork(int choice) { + switch (choice) { + case 1: + return new FaceBook(); + case 2: + return new Twitter(); + default: + throw new IllegalArgumentException("존재하지 않는 번호입니다: " + choice); + } + } +} diff --git a/templatemethodpattern/src/networks/FaceBook.java b/templatemethodpattern/src/networks/FaceBook.java new file mode 100644 index 0000000..2e0feb5 --- /dev/null +++ b/templatemethodpattern/src/networks/FaceBook.java @@ -0,0 +1,42 @@ +package networks; + +public class FaceBook extends Network { + + @Override + protected boolean logIn(String userName, String password) { + System.out.println("\nChecking user's parameters"); + System.out.println("Name: " + userName); + System.out.print("Password: "); + for (int i = 0; i < password.length(); i++) { + System.out.print("*"); + } + simulateNetworkLatency(); + System.out.println("\n\nLogIn success on Facebook"); + return true; + } + + @Override + protected boolean sendData(byte[] data) { + System.out.println("Message: '" + new String(data) + "' was posted on Facebook"); + return true; + } + + @Override + protected void logOut(String userName) { + System.out.println("User: '" + userName + "' was logged out from Facebook"); + } + + private void simulateNetworkLatency() { + try { + int i = 0; + System.out.println(); + while (i < 10) { + System.out.print("."); + Thread.sleep(500); + i++; + } + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + } +} diff --git a/templatemethodpattern/src/networks/Network.java b/templatemethodpattern/src/networks/Network.java new file mode 100644 index 0000000..36b073b --- /dev/null +++ b/templatemethodpattern/src/networks/Network.java @@ -0,0 +1,19 @@ +package networks; + +public abstract class Network { + + public boolean post(String message, String userName, String password) { + if (logIn(userName, password)) { + boolean result = sendData(message.getBytes()); + logOut(userName); + return result; + } + return false; + } + + protected abstract boolean logIn(String userName, String password); + + protected abstract boolean sendData(byte[] data); + + protected abstract void logOut(String userName); +} diff --git a/templatemethodpattern/src/networks/Twitter.java b/templatemethodpattern/src/networks/Twitter.java new file mode 100644 index 0000000..f5a0410 --- /dev/null +++ b/templatemethodpattern/src/networks/Twitter.java @@ -0,0 +1,42 @@ +package networks; + +public class Twitter extends Network{ + + @Override + protected boolean logIn(String userName, String password) { + System.out.println("\nChecking user's parameters"); + System.out.println("Name: " + userName); + System.out.print("Password: "); + for (int i = 0; i < password.length(); i++) { + System.out.print("*"); + } + simulateNetworkLatency(); + System.out.println("\n\nLogIn success on Twitter"); + return true; + } + + @Override + protected boolean sendData(byte[] data) { + System.out.println("Message: '" + new String(data) + "' was posted on Twitter"); + return true; + } + + @Override + protected void logOut(String userName) { + System.out.println("User: '" + userName + "' was logged out from Twitter"); + } + + private void simulateNetworkLatency() { + try { + int i = 0; + System.out.println(); + while (i < 10) { + System.out.print("."); + Thread.sleep(500); + i++; + } + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + } +} From 7f21d9bb72306f0d54b491de101da575e871dd15 Mon Sep 17 00:00:00 2001 From: wonu606 Date: Thu, 13 Jul 2023 23:36:09 +0900 Subject: [PATCH 12/12] =?UTF-8?q?chore:=20=ED=85=9C=ED=94=8C=EB=A6=BF=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C,=20=EB=B0=98=EB=B3=B5=EC=9E=90,=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EC=A7=80=ED=8A=B8=20=ED=8C=A8=ED=84=B4?= =?UTF-8?q?=EB=A5=BC=20Merge=ED=95=B4=EB=B2=84=EB=A0=A4=EC=84=9C=20?= =?UTF-8?q?=ED=8F=B4=EB=8D=94=20=EC=9D=B4=EB=8F=99=ED=95=98=EC=97=AC=20PR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {compositepattern => chapter8,9/compositepattern}/src/Demo.java | 0 .../compositepattern}/src/editor/ImageEditor.java | 0 .../compositepattern}/src/shapes/BaseShape.java | 0 .../compositepattern}/src/shapes/Circle.java | 0 .../compositepattern}/src/shapes/CompoundShape.java | 0 .../compositepattern}/src/shapes/Dot.java | 0 .../compositepattern}/src/shapes/Rectangle.java | 0 .../compositepattern}/src/shapes/Shape.java | 0 {iteratorpattern => chapter8,9/iteratorpattern}/src/Demo.java | 0 .../iteratorpattern}/src/iterators/FacebookIterator.java | 0 .../iteratorpattern}/src/iterators/LinkedInIterator.java | 0 .../iteratorpattern}/src/iterators/ProfileIterator.java | 0 .../iteratorpattern}/src/profile/Profile.java | 0 .../iteratorpattern}/src/social_networks/Facebook.java | 0 .../iteratorpattern}/src/social_networks/LinkedIn.java | 0 .../iteratorpattern}/src/social_networks/SocialNetwork.java | 0 .../iteratorpattern}/src/spammer/SocialSpammer.java | 0 .../templatemethodpattern}/src/Demo.java | 0 .../templatemethodpattern}/src/networks/FaceBook.java | 0 .../templatemethodpattern}/src/networks/Network.java | 0 .../templatemethodpattern}/src/networks/Twitter.java | 0 21 files changed, 0 insertions(+), 0 deletions(-) rename {compositepattern => chapter8,9/compositepattern}/src/Demo.java (100%) rename {compositepattern => chapter8,9/compositepattern}/src/editor/ImageEditor.java (100%) rename {compositepattern => chapter8,9/compositepattern}/src/shapes/BaseShape.java (100%) rename {compositepattern => chapter8,9/compositepattern}/src/shapes/Circle.java (100%) rename {compositepattern => chapter8,9/compositepattern}/src/shapes/CompoundShape.java (100%) rename {compositepattern => chapter8,9/compositepattern}/src/shapes/Dot.java (100%) rename {compositepattern => chapter8,9/compositepattern}/src/shapes/Rectangle.java (100%) rename {compositepattern => chapter8,9/compositepattern}/src/shapes/Shape.java (100%) rename {iteratorpattern => chapter8,9/iteratorpattern}/src/Demo.java (100%) rename {iteratorpattern => chapter8,9/iteratorpattern}/src/iterators/FacebookIterator.java (100%) rename {iteratorpattern => chapter8,9/iteratorpattern}/src/iterators/LinkedInIterator.java (100%) rename {iteratorpattern => chapter8,9/iteratorpattern}/src/iterators/ProfileIterator.java (100%) rename {iteratorpattern => chapter8,9/iteratorpattern}/src/profile/Profile.java (100%) rename {iteratorpattern => chapter8,9/iteratorpattern}/src/social_networks/Facebook.java (100%) rename {iteratorpattern => chapter8,9/iteratorpattern}/src/social_networks/LinkedIn.java (100%) rename {iteratorpattern => chapter8,9/iteratorpattern}/src/social_networks/SocialNetwork.java (100%) rename {iteratorpattern => chapter8,9/iteratorpattern}/src/spammer/SocialSpammer.java (100%) rename {templatemethodpattern => chapter8,9/templatemethodpattern}/src/Demo.java (100%) rename {templatemethodpattern => chapter8,9/templatemethodpattern}/src/networks/FaceBook.java (100%) rename {templatemethodpattern => chapter8,9/templatemethodpattern}/src/networks/Network.java (100%) rename {templatemethodpattern => chapter8,9/templatemethodpattern}/src/networks/Twitter.java (100%) diff --git a/compositepattern/src/Demo.java b/chapter8,9/compositepattern/src/Demo.java similarity index 100% rename from compositepattern/src/Demo.java rename to chapter8,9/compositepattern/src/Demo.java diff --git a/compositepattern/src/editor/ImageEditor.java b/chapter8,9/compositepattern/src/editor/ImageEditor.java similarity index 100% rename from compositepattern/src/editor/ImageEditor.java rename to chapter8,9/compositepattern/src/editor/ImageEditor.java diff --git a/compositepattern/src/shapes/BaseShape.java b/chapter8,9/compositepattern/src/shapes/BaseShape.java similarity index 100% rename from compositepattern/src/shapes/BaseShape.java rename to chapter8,9/compositepattern/src/shapes/BaseShape.java diff --git a/compositepattern/src/shapes/Circle.java b/chapter8,9/compositepattern/src/shapes/Circle.java similarity index 100% rename from compositepattern/src/shapes/Circle.java rename to chapter8,9/compositepattern/src/shapes/Circle.java diff --git a/compositepattern/src/shapes/CompoundShape.java b/chapter8,9/compositepattern/src/shapes/CompoundShape.java similarity index 100% rename from compositepattern/src/shapes/CompoundShape.java rename to chapter8,9/compositepattern/src/shapes/CompoundShape.java diff --git a/compositepattern/src/shapes/Dot.java b/chapter8,9/compositepattern/src/shapes/Dot.java similarity index 100% rename from compositepattern/src/shapes/Dot.java rename to chapter8,9/compositepattern/src/shapes/Dot.java diff --git a/compositepattern/src/shapes/Rectangle.java b/chapter8,9/compositepattern/src/shapes/Rectangle.java similarity index 100% rename from compositepattern/src/shapes/Rectangle.java rename to chapter8,9/compositepattern/src/shapes/Rectangle.java diff --git a/compositepattern/src/shapes/Shape.java b/chapter8,9/compositepattern/src/shapes/Shape.java similarity index 100% rename from compositepattern/src/shapes/Shape.java rename to chapter8,9/compositepattern/src/shapes/Shape.java diff --git a/iteratorpattern/src/Demo.java b/chapter8,9/iteratorpattern/src/Demo.java similarity index 100% rename from iteratorpattern/src/Demo.java rename to chapter8,9/iteratorpattern/src/Demo.java diff --git a/iteratorpattern/src/iterators/FacebookIterator.java b/chapter8,9/iteratorpattern/src/iterators/FacebookIterator.java similarity index 100% rename from iteratorpattern/src/iterators/FacebookIterator.java rename to chapter8,9/iteratorpattern/src/iterators/FacebookIterator.java diff --git a/iteratorpattern/src/iterators/LinkedInIterator.java b/chapter8,9/iteratorpattern/src/iterators/LinkedInIterator.java similarity index 100% rename from iteratorpattern/src/iterators/LinkedInIterator.java rename to chapter8,9/iteratorpattern/src/iterators/LinkedInIterator.java diff --git a/iteratorpattern/src/iterators/ProfileIterator.java b/chapter8,9/iteratorpattern/src/iterators/ProfileIterator.java similarity index 100% rename from iteratorpattern/src/iterators/ProfileIterator.java rename to chapter8,9/iteratorpattern/src/iterators/ProfileIterator.java diff --git a/iteratorpattern/src/profile/Profile.java b/chapter8,9/iteratorpattern/src/profile/Profile.java similarity index 100% rename from iteratorpattern/src/profile/Profile.java rename to chapter8,9/iteratorpattern/src/profile/Profile.java diff --git a/iteratorpattern/src/social_networks/Facebook.java b/chapter8,9/iteratorpattern/src/social_networks/Facebook.java similarity index 100% rename from iteratorpattern/src/social_networks/Facebook.java rename to chapter8,9/iteratorpattern/src/social_networks/Facebook.java diff --git a/iteratorpattern/src/social_networks/LinkedIn.java b/chapter8,9/iteratorpattern/src/social_networks/LinkedIn.java similarity index 100% rename from iteratorpattern/src/social_networks/LinkedIn.java rename to chapter8,9/iteratorpattern/src/social_networks/LinkedIn.java diff --git a/iteratorpattern/src/social_networks/SocialNetwork.java b/chapter8,9/iteratorpattern/src/social_networks/SocialNetwork.java similarity index 100% rename from iteratorpattern/src/social_networks/SocialNetwork.java rename to chapter8,9/iteratorpattern/src/social_networks/SocialNetwork.java diff --git a/iteratorpattern/src/spammer/SocialSpammer.java b/chapter8,9/iteratorpattern/src/spammer/SocialSpammer.java similarity index 100% rename from iteratorpattern/src/spammer/SocialSpammer.java rename to chapter8,9/iteratorpattern/src/spammer/SocialSpammer.java diff --git a/templatemethodpattern/src/Demo.java b/chapter8,9/templatemethodpattern/src/Demo.java similarity index 100% rename from templatemethodpattern/src/Demo.java rename to chapter8,9/templatemethodpattern/src/Demo.java diff --git a/templatemethodpattern/src/networks/FaceBook.java b/chapter8,9/templatemethodpattern/src/networks/FaceBook.java similarity index 100% rename from templatemethodpattern/src/networks/FaceBook.java rename to chapter8,9/templatemethodpattern/src/networks/FaceBook.java diff --git a/templatemethodpattern/src/networks/Network.java b/chapter8,9/templatemethodpattern/src/networks/Network.java similarity index 100% rename from templatemethodpattern/src/networks/Network.java rename to chapter8,9/templatemethodpattern/src/networks/Network.java diff --git a/templatemethodpattern/src/networks/Twitter.java b/chapter8,9/templatemethodpattern/src/networks/Twitter.java similarity index 100% rename from templatemethodpattern/src/networks/Twitter.java rename to chapter8,9/templatemethodpattern/src/networks/Twitter.java