💡 디자인 패턴
이란?
💡 전략 패턴 (strategy pattern)
이란?
객체의 행위를 바꾸고 싶은 경우 '직접' 수정하지 않고 전략
이라고 부르는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴
컨텍스트
- 상황, 맥락, 문맥
- 개발자가 어떠한 작업을 완료하는데 필요한 모든 관련 정보
🔗 실제 사용
passport
미들웨어 라이브러리LocalStrategy 전략
: 회원가입된 아이디와 비밀번호를 기반으로 인증OAuth 전략
: 페이스북, 네이버 등 다른 서비스를 기반으로 인증⭐️ 전략 패턴 활용 자바 예시 코드
👉 쇼핑 카트에 아이템을 담아 LUNACard 또는 KAKAOCard 라는 두 개의 전략으로 결제하는 코드
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;
}
public void pay(PaymentStrategy paymentMethod){
int amount = calculateTotal();
paymentMethod.pay(amount);
}
}
public class StrategyPattern{
public static void main(String[] args){
ShoppingCart cart = new ShoppingCart();
Item A = new Item("kundolA",100);
Item B = new Item("kundolB",200);
cart.addItem(A);
cart.addItem(B);
// pay by LUNACard
cart.pay(new LUNACardStrategy("kundol@example.com","temppwd"));
// pay by KAKAOCard
cart.pay(new KAKAOCardStrategy("Yijun","1234","123","8/13"));
}
}
/*
300 paid using LUNACard.
400 paid using KAKAOCard.
*/