객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 전략이라고 부르는
캡슐화한 알고리즘
을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴
if-else
코드 블럭으로 구성되어 있는데, 모든 코드가 비슷한 기능을 수행하는 경우import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
// strategy & concrete strategy
interface PaymentStrategy {
public void pay(int amount);
}
class KAKAOCardStrategy implements PaymentStrategy {
private String name;
private String cardNumber;
private String cvv;
private String dateOfExpiry;
public KAKAOCardStrategy (String nm, String ccNum, String cvv, String expiryDate) {
this.name = nm;
this.cardNumber = ccNum;
this.cvv = cvv;
this.dateOfExpiry = expiryDate;
}
@Override
public void pay (int amount) {
System.out.println(amount + " paid using KAKAOCard.");
}
}
class LUNACardStrategy implements PaymentStrategy {
private String emailId;
private String password;
public LUNACardStrategy (String email, String pwd) {
this.emailId = email;
this.password = pwd;
}
@Override
public void pay (int amount) {
System.out.println(amount + " paid using LUNACard.");
}
}
class Item {
private String name;
private int price;
public Item(String name, int cost) {
this.name = name;
this.price = cost;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
}
class ShoppingCart {
List<Item> items;
public ShoppingCart() {
this.items = new ArrayList<Item>();
}
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;
}
// context
public void pay(PaymentStrategy paymentMethod) {
int amount = calculateTotal();
paymentMethod.pay(amount);
}
}
public class Demo {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
Item A = new Item("kundolA", 100);
Item B = new Item("kundolB", 300);
cart.addItem(A);
cart.addItem(B);
// client
// pay by LUNACard
cart.pay(new LUNACardStrategy("kundol@example.com", "abcde"));
// pay by KAKAOCard
cart.pay(new KAKAOCardStrategy("Amy", "123456", "123", "12/01"));
}
}
💡 결제를 하는 pay()
함수에는 KAKAOCard
를 사용할지 LUNACard
를 사용할지에 대한 어떠한 로직도 존재하지 않는다. pay()
함수를 포함한 PaymentStrategy
라는 인터페이스를 KAKAOCardStrategy
와 LUNACardStrategy
클래스가 각각 상속 받아 그 안에서 각자 pay()
함수를 처리한다.
👉 추후에 다른 카드들이 추가되더라도 pay()
함수를 수정할 필요 없다