CS

[디자인 패턴] 전략 패턴

sangyunpark 2023. 8. 21. 20:01

전략 패턴이란?

정책 패턴이라고도 하며, 객체의 행위를 바꾸고 싶을 경우 직접 수정하지 않고 전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서

바꿔주면서 상호 교체가 가능하게 만드는 패턴이다.

 

 

상황 예시

어떠한 물건을 살 때 네이버페이, 카카오페이 등 다양한 방법으로 결제하듯이 어떠한 아이템을 살 때 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 expireDate){
    	this.name = nm;
        this.ccNum = ccNum;
        this.cvv = cvv;
        this.dateOfExpirty = expiryDate;
    }
    
    @Override
    public void pay(int number){
    	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 Items(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(PaymentsStrategy paymentMethod){
    	int amount = calculateTotal();
        paymentMethod.pay(amount);
    }
}

public class HelloWorld{
	public static void main(String[] args){
    	ShoppingCart cart = new ShoppingCart();
        
        Item A = new Item("kundo1A",100);
        Item B = new Item("kundo1B",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("abc","123456789","123","12/01");
    }
}

쇼핑 카트에 아이템을 담아 LUNACard 또는 KAKAOCard라는 두 개의 전략으로 결제하는 코드