티스토리 뷰

 

전략 패턴(strategy pattern) ≒ 정책 패턴(policy pattern)

전략이라고 부르는 '캡슐화'한 알고리즘을 선택할 수 있게 하는 소프트웨어 디자인 패턴이다.

 

면접을 위한 cs 전공 지식 노트 예제에서는 이커머스 사이트에서 결제를 할 때 다양한 방법을 선택할 수 있듯이, 예제에서  제품을 결제 방법의 '전략' (결제수단?)만 바꿔서 LUNACard로 사는 것과 KAKAOCard로 사는 것을 구연한 예시를 보여줬다.

 

/* 
면접을 위한 cs 전공 지식 노트 예제
3.전략 패턴(strategy pattern)
	객체의 행위를 바꾸고 싶은 경우 '직접'수정하지 않고 '캡슐화한 알고리즘'을 선택할 수 있도록하는
	소프트 웨어 디자인 패턴이다.

*/

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
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 HelloWorld {
    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);
        
        // pay by LUNACard
        cart.pay(new LUNACardStrategy("kundol@example.com","pukubababo"));
        
        // pay by KAKAOCard
        cart.pay(new KAKAOCardStrategy("Ju hongchul", "123456789","123","12/01"));
    }
}
/* 실행 결과값

400 paid using LUNACard.
400 paid using KAKAOCard.

*/
댓글