๐พ [CS] ์ ๋ต ํจํด(Strategy pattern)
1๏ธโฃ ์ ๋ต ํจํด(Strategy pattern)
- ์ ๋ต ํจํด(Strategy pattern) ์ ์ ์ฑ ํจํด(Policy pattern) ์ด๋ผ๊ณ ๋ ํ๋ฉฐ, ๊ฐ์ฑ์ ํ์๋ฅผ ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒฝ์ฐ โ์ง์ โ ์์ ํ์ง ์๊ณ ์ ๋ต์ด๋ผ๊ณ ๋ถ๋ฅด๋ โ์บก์ํํ ์๊ณ ๋ฆฌ์ฆโ ์ ์ปจํ ์คํธ ์์์ ๋ฐ๊ฟ์ฃผ๋ฉด์ ์ํธ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ํจํด์ ๋๋ค.
- ์๋์ ์์ ์ฝ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๊ฒ์ ์ด ๋ ๋ค์ด๋ฒํ์ด, ์นด์นด์คํ์ด ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฒฐ์ ํ๋ฏ์ด ์ด๋ค ์์ดํ
์ ์ด ๋
LUNACard
๋ก ์ฌ๋ ๊ฒ๊ณผKAKAOCard
๋ก ์ฌ๋ ๊ฒ์ ๊ตฌํํ ์์ ์ ๋๋ค.- ๊ฒฐ์ ๋ฐฉ์์ โ์ ๋ตโ ๋ง ๋ฐ๊ฟ์ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ฒฐ์ ํ๋ ๊ฒ์ ๊ตฌํํ์ต๋๋ค.
// PaymentStrategy - interface
public interface PaymentStrategy {
void pay(int amount);
}
// KAKAOCardStrategy
public class KAKAOCardStrategy implements PaymentStrategy{
private String name;
private String cardNumber;
private String cvv;
private String dateOfExpiry;
public KAKAOCardStrategy(String name, String cardNumber, String cvv, String dateOfExpiry) {
this.name = name;
this.cardNumber = cardNumber;
this.cvv = cvv;
this.dateOfExpiry = dateOfExpiry;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid using KAKAOCard.");
}
}
// LUNACardStrategy
public class LUNACardStrategy implements PaymentStrategy {
private String emailId;
private String password;
public LUNACardStrategy(String emailId, String password) {
this.emailId = emailId;
this.password = password;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid using LUNACard");
}
}
// Item
public class Item {
private String name;
private int price;
public Item(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
// ShoppingCart
import java.util.ArrayList;
import java.util.List;
public class ShoppingCart {
List<Item> items;
public ShoppingCart() {
this.items = new ArrayList<>();
}
public void addItem(Item item) {
this.items.add(item);
}
public void removeItem(Item item) {
this.items.remove(item);
}
public int calculateTotal() {
int sum = 0;
for (Item item : items) {
sum += item.getPrice();
}
return sum;
}
public void pay(PaymentStrategy pamentMethod) {
int amount = calculateTotal();
pamentMethod.pay(amount);
}
}
// Main
import designPattern.strategy.Item;
import designPattern.strategy.KAKAOCardStrategy;
import designPattern.strategy.LUNACardStrategy;
import designPattern.strategy.ShoppingCart;
public class Main {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
Item A = new Item("A", 100);
Item B = new Item("B", 300);
cart.addItem(A);
cart.addItem(B);
// pay by LUNACard
cart.pay(new LUNACardStrategy("kobe@google.com", "1234"));
// pay by KAKAOCard
cart.pay(new KAKAOCardStrategy("Minseong Kang", "123456789", "123", "12/01"));
}
}
์คํ ๊ฒฐ๊ณผ
400 paid using LUNACard
400 paid using KAKAOCard.
- ์ ์ฝ๋๋ ์ผํ ์นด๋์ ์์ดํ
์ ๋ด์
LUNACard
๋๋KAKAOCard
๋ผ๋ ๋ ๊ฐ์ ์ ๋ต์ผ๋ก ๊ฒฐ์ ํ๋ ์ฝ๋์ ๋๋ค.
์ฉ์ด : ์ปจํ ์คํธ
ํ๋ก๊ทธ๋๋ฐ์์์ ์ปจํ ์คํธ๋ ์ํฉ, ๋งฅ๋ฝ, ๋ฌธ๋งฅ์ ์๋ฏธํ๋ฉฐ ๊ฐ๋ฐ์๊ฐ ์ด๋ ํ ์์ ์ ์๋ฃํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ด๋ จ ์ ๋ณด๋ฅผ ๋งํฉ๋๋ค.