From ce52abbefd269a992b12ca63f316d7ab9370636d Mon Sep 17 00:00:00 2001 From: Emin Yildiz Date: Mon, 17 Jul 2023 13:41:46 +0300 Subject: [PATCH] add command design pattern --- .../Command Design Pattern/.gitignore | 29 ++++ .../Command Design Pattern/.idea/.gitignore | 8 ++ .../Command Design Pattern/.idea/misc.xml | 6 + .../Command Design Pattern/.idea/modules.xml | 8 ++ .../.idea/uiDesigner.xml | 124 ++++++++++++++++++ .../Command Design Pattern/.idea/vcs.xml | 6 + .../Command Design Pattern.iml | 11 ++ .../Command Design Pattern/ReadMe.md | 19 +++ .../src/AbstractCommand.java | 18 +++ .../Command Design Pattern/src/Command.java | 3 + .../src/EURAccount.java | 5 + .../src/GeneralInstanceFactory.java | 13 ++ .../Command Design Pattern/src/Main.java | 16 +++ .../Command Design Pattern/src/Payment.java | 18 +++ .../src/PaymentAccount.java | 8 ++ .../src/PaymentConstants.java | 10 ++ .../Command Design Pattern/src/Product.java | 36 +++++ .../Command Design Pattern/src/RePayment.java | 21 +++ .../src/USDAccount.java | 5 + .../Command Design Pattern/src/User.java | 50 +++++++ 20 files changed, 414 insertions(+) create mode 100644 Behavioral Design Pattern/Command Design Pattern/.gitignore create mode 100644 Behavioral Design Pattern/Command Design Pattern/.idea/.gitignore create mode 100644 Behavioral Design Pattern/Command Design Pattern/.idea/misc.xml create mode 100644 Behavioral Design Pattern/Command Design Pattern/.idea/modules.xml create mode 100644 Behavioral Design Pattern/Command Design Pattern/.idea/uiDesigner.xml create mode 100644 Behavioral Design Pattern/Command Design Pattern/.idea/vcs.xml create mode 100644 Behavioral Design Pattern/Command Design Pattern/Command Design Pattern.iml create mode 100644 Behavioral Design Pattern/Command Design Pattern/ReadMe.md create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/AbstractCommand.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/Command.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/EURAccount.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/GeneralInstanceFactory.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/Main.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/Payment.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/PaymentAccount.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/PaymentConstants.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/Product.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/RePayment.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/USDAccount.java create mode 100644 Behavioral Design Pattern/Command Design Pattern/src/User.java diff --git a/Behavioral Design Pattern/Command Design Pattern/.gitignore b/Behavioral Design Pattern/Command Design Pattern/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/Behavioral Design Pattern/Command Design Pattern/.idea/.gitignore b/Behavioral Design Pattern/Command Design Pattern/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Behavioral Design Pattern/Command Design Pattern/.idea/misc.xml b/Behavioral Design Pattern/Command Design Pattern/.idea/misc.xml new file mode 100644 index 0000000..e0844bc --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Behavioral Design Pattern/Command Design Pattern/.idea/modules.xml b/Behavioral Design Pattern/Command Design Pattern/.idea/modules.xml new file mode 100644 index 0000000..9bfa4d4 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Behavioral Design Pattern/Command Design Pattern/.idea/uiDesigner.xml b/Behavioral Design Pattern/Command Design Pattern/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Behavioral Design Pattern/Command Design Pattern/.idea/vcs.xml b/Behavioral Design Pattern/Command Design Pattern/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Behavioral Design Pattern/Command Design Pattern/Command Design Pattern.iml b/Behavioral Design Pattern/Command Design Pattern/Command Design Pattern.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/Command Design Pattern.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Behavioral Design Pattern/Command Design Pattern/ReadMe.md b/Behavioral Design Pattern/Command Design Pattern/ReadMe.md new file mode 100644 index 0000000..97f8eaf --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/ReadMe.md @@ -0,0 +1,19 @@ +# Command Design Pattern + +Command design pattern, bir istek/komutu, bir yöntemi çağıracak ve parametreler gibi gerekli tüm verileri kapsülleyecek bir nesneye dönüştürmek için kullanılır. +Bu, isteklerin ve eylemlerin daha esnek ve soyut bir şekilde temsil edilmesini sağlar. + +## Problem + +- İstemcinin bir işlem yapacağı zaman bu işlemin hem ne yapıldığından hem de nasıl yapıldığından habersiz karşılayabilmesi gerekmektedir. +- Örneğin, istemci yalnızca “Yap” demeli ve eldeki veriler en uygun algoritma ile sıralanmalıdır. +- Aslında istemci “Yap” dediğinde elindeki verilerin sıralanacağını mı yoksa silineceğini mi yoksa başka bir şey mi olacağını bilemez. + +## Çözüm + +- Command design pattern bir istek atıldığı zaman bu isteğin direkt olarak atılmaması gerektiğini belirtir. + +- İstek atan nesne ile istek alan nesne arasında bu isteği ileten ayrı bir nesne ile istek atarsak hem alıcı hemde verici nesneler kendi görevleri ile ilgilenmiş olurlar +ve birbirlerine olan bağımlılığı ortadan kalmış olur. + +- İstemci sadece bir metod üzerinden istek atar bu metod "execute()" olarak adlandırılır. diff --git a/Behavioral Design Pattern/Command Design Pattern/src/AbstractCommand.java b/Behavioral Design Pattern/Command Design Pattern/src/AbstractCommand.java new file mode 100644 index 0000000..c008ab1 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/AbstractCommand.java @@ -0,0 +1,18 @@ +public class AbstractCommand implements Command{ + + protected PaymentAccount getCorrectPaymentAccount(User user, Product product){ + String currency = product.getCurrency(); + if(PaymentConstants.USD.equals(currency)){ + return user.getUsdAccount(); + }else if (PaymentConstants.EUR.equals(currency)){ + return user.getEurAccount(); + }else { + return null; + } + } + + @Override + public void execute(User user, Product product) { + + } +} diff --git a/Behavioral Design Pattern/Command Design Pattern/src/Command.java b/Behavioral Design Pattern/Command Design Pattern/src/Command.java new file mode 100644 index 0000000..d41c9b0 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/Command.java @@ -0,0 +1,3 @@ +public interface Command { + void execute(User user, Product product); +} diff --git a/Behavioral Design Pattern/Command Design Pattern/src/EURAccount.java b/Behavioral Design Pattern/Command Design Pattern/src/EURAccount.java new file mode 100644 index 0000000..e95467b --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/EURAccount.java @@ -0,0 +1,5 @@ +public class EURAccount extends PaymentAccount { + public EURAccount(double balance){ + super(balance); + } +} diff --git a/Behavioral Design Pattern/Command Design Pattern/src/GeneralInstanceFactory.java b/Behavioral Design Pattern/Command Design Pattern/src/GeneralInstanceFactory.java new file mode 100644 index 0000000..9471b11 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/GeneralInstanceFactory.java @@ -0,0 +1,13 @@ +import java.util.ArrayList; + +public class GeneralInstanceFactory { + public static Product getTelephoneInstance(){ // telefon nesnesi oluşturup geriye döner. + return new Product("Telefon","USD",1150); + } + + public static User getUserInstance(){ // örnek bir user nesnesi oluşturur ve geriye döner. + USDAccount usdAccount = new USDAccount(2000); + EURAccount eurAccount = new EURAccount(2000); + return new User(usdAccount, eurAccount, new ArrayList<>()); + } +} diff --git a/Behavioral Design Pattern/Command Design Pattern/src/Main.java b/Behavioral Design Pattern/Command Design Pattern/src/Main.java new file mode 100644 index 0000000..908882e --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/Main.java @@ -0,0 +1,16 @@ +public class Main { + public static void main(String[] args) { + + Product telephone = GeneralInstanceFactory.getTelephoneInstance(); // telefon nesnesi üretip getirdi + User user = GeneralInstanceFactory.getUserInstance(); // user nesnesi oluşturup getirdi + + onButtonClick(new Payment(), user, telephone); + user.showInfo(); + + onButtonClick(new RePayment(), user, telephone); + user.showInfo(); + } + + private static void onButtonClick(Command command, User user, Product product){ + command.execute(user, product); + }} \ No newline at end of file diff --git a/Behavioral Design Pattern/Command Design Pattern/src/Payment.java b/Behavioral Design Pattern/Command Design Pattern/src/Payment.java new file mode 100644 index 0000000..3102fad --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/Payment.java @@ -0,0 +1,18 @@ +public class Payment extends AbstractCommand{ + @Override + public void execute(User user, Product product) { + PaymentAccount account = getCorrectPaymentAccount(user, product); + double newBalance; + if(account instanceof USDAccount){ // USDAccount nesnesi mi? + newBalance = user.getUsdAccount().balance - product.getPrice(); // aldığı ürünü hesaptaki paradan düşürüyor. + user.getUsdAccount().balance = newBalance; + System.out.println(PaymentConstants.PAYMENT_INFO_FOR_USD); + } + else if(account instanceof EURAccount){ + newBalance = user.getEurAccount().balance - product.getPrice(); + user.getEurAccount().balance = newBalance; + System.out.println(PaymentConstants.PAYMENT_INFO_FOR_EUR); + } + user.getProductList().add(product); + } +} diff --git a/Behavioral Design Pattern/Command Design Pattern/src/PaymentAccount.java b/Behavioral Design Pattern/Command Design Pattern/src/PaymentAccount.java new file mode 100644 index 0000000..4fe0e84 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/PaymentAccount.java @@ -0,0 +1,8 @@ +public abstract class PaymentAccount { + protected double balance; + + public PaymentAccount(double balance){ + this.balance = balance; + } + +} diff --git a/Behavioral Design Pattern/Command Design Pattern/src/PaymentConstants.java b/Behavioral Design Pattern/Command Design Pattern/src/PaymentConstants.java new file mode 100644 index 0000000..c15054b --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/PaymentConstants.java @@ -0,0 +1,10 @@ +public class PaymentConstants { + public static final String USD = "USD"; + public static final String EUR = "EUR"; + + public static final String PAYMENT_INFO_FOR_USD = "Dolar Hesabından Ödeme İşlemi Gerçekleştirildi."; + public static final String PAYMENT_INFO_FOR_EUR = "Euro Hesabından Ödeme İşlemi Gerçekleştirildi."; + + public static final String REPAYMENT_INFO_FOR_USD = "Dolar Hesabına İade İşlemi Gerçekleştirildi."; + public static final String REPAYMENT_INFO_FOR_EUR = "Euro Hesabına İade İşlemi Gerçekleştirildi."; +} diff --git a/Behavioral Design Pattern/Command Design Pattern/src/Product.java b/Behavioral Design Pattern/Command Design Pattern/src/Product.java new file mode 100644 index 0000000..4f73814 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/Product.java @@ -0,0 +1,36 @@ +public class Product { + + private String name; + private String currency; + private double price; + + public Product(String name, String currency, double price) { + this.name = name; + this.currency = currency; + this.price = price; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } +} diff --git a/Behavioral Design Pattern/Command Design Pattern/src/RePayment.java b/Behavioral Design Pattern/Command Design Pattern/src/RePayment.java new file mode 100644 index 0000000..1b1328b --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/RePayment.java @@ -0,0 +1,21 @@ +public class RePayment extends AbstractCommand{ + + @Override + public void execute(User user, Product product) { + PaymentAccount account = getCorrectPaymentAccount(user, product); + double newBalance; + if(account instanceof USDAccount){ + newBalance = user.getUsdAccount().balance + product.getPrice(); + user.getUsdAccount().balance = newBalance; + System.out.println(PaymentConstants.PAYMENT_INFO_FOR_USD); + } + else if(account instanceof EURAccount){ + newBalance = user.getEurAccount().balance + product.getPrice(); + user.getEurAccount().balance = newBalance; + System.out.println(PaymentConstants.PAYMENT_INFO_FOR_EUR); + } + + user.getProductList().remove(product); + } + +} diff --git a/Behavioral Design Pattern/Command Design Pattern/src/USDAccount.java b/Behavioral Design Pattern/Command Design Pattern/src/USDAccount.java new file mode 100644 index 0000000..0f38ea8 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/USDAccount.java @@ -0,0 +1,5 @@ +public class USDAccount extends PaymentAccount { + public USDAccount(double balance){ + super(balance); + } +} diff --git a/Behavioral Design Pattern/Command Design Pattern/src/User.java b/Behavioral Design Pattern/Command Design Pattern/src/User.java new file mode 100644 index 0000000..ef27a51 --- /dev/null +++ b/Behavioral Design Pattern/Command Design Pattern/src/User.java @@ -0,0 +1,50 @@ +import java.util.List; + +public class User { + private USDAccount usdAccount; + private EURAccount eurAccount; + private List productList; + + public User(USDAccount usdAccount, EURAccount eurAccount, List productList) { + this.usdAccount = usdAccount; + this.eurAccount = eurAccount; + this.productList = productList; + } + + public void showInfo() { + System.out.println("Dolar Hesabı Bakiyesi : " + usdAccount.balance + PaymentConstants.USD); + System.out.println("Euro Hesabı Bakiyesi : " + eurAccount.balance + PaymentConstants.EUR); + if (productList.size() == 0) { + System.out.println("Satın Aldığınız Bir Ürün Bulunmamaktadır!"); + } else { + System.out.println("Satın Aldığınız Ürünler : "); + for (Product product : productList) { + System.out.println(product.getName()); + } + } + } + + public USDAccount getUsdAccount() { + return usdAccount; + } + + public void setUsdAccount(USDAccount usdAccount) { + this.usdAccount = usdAccount; + } + + public EURAccount getEurAccount() { + return eurAccount; + } + + public void setEurAccount(EURAccount eurAccount) { + this.eurAccount = eurAccount; + } + + public List getProductList() { + return productList; + } + + public void setProductList(List productList) { + this.productList = productList; + } +}