본문 바로가기

소프트웨어-이야기/프로그래밍 언어와 프레임워크

디자인패턴 - Strategy Design Pattern

Strategy Design Pattern 

대부분의 기능은 동일하지만, 타입에 따라 일부 동작만 다르게 처리해야하는 경우, 유용한 디자인 패턴이다. 

본 글에서는 결제 방법 (토스 혹은 포인트 결제)에 따라 장바구니 기능이 다르게 동작하는 예제를 설명할 것이다. 

Diagram 

 

Example

public interface PaymentStrategy {

	public void pay(int amount);
}

 

public class PointStrategy implements PointStrategy {

	private String userId;
	
	public PointStrategy(String userId){
		this.userId=userId;
	}
	@Override
	public void pay(int amount) {
		System.out.println(amount +" paid with point");
	}

}
public class TosssStrategy implements PaymentStrategy {

	private String orderId;
	
	public TosssStrategy(String orderId){
		this.orderNo=orderNo;
	}
	
	@Override
	public void pay(int amount) {
		System.out.println(amount + " paid using Toss.");
	}

}
@Getter
@AllArgsConstructor
public class Item {
	private String id;
	private Money price;
}
public class ShoppingCart {

	private 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 ShoppingCartTest {

	public static void main(String[] args) {
		ShoppingCart cart = new ShoppingCart();
		
		Item item1 = new Item("1234",10);
		Item item2 = new Item("5678",40);
		
		cart.addItem(item1);
		cart.addItem(item2);
		
		// 토스 결제인 경우
		cart.pay(new TossStrategy("1"));
		
		// 포인트 결제인 경우
		cart.pay(new PointStrategy("1"));
	}

}

 

Reference

https://www.digitalocean.com/community/tutorials/strategy-design-pattern-in-java-example-tutorial

머메이드 다이어그램

---
title: PaymentStrategy
---
classDiagram
    class Item{
        -String id
        -Money price
        +getId()
        +getPrice()
    }
    class ShoppingCart{
        -List<Item> items
        +addItem(Item item)
        +removeItem(Item item)
        +calculateTotal()
        +pay(PaymentStrategy paymentMethod)

    }
    class PaymentStrategy 
    <<interface>> PaymentStrategy
    PaymentStrategy : pay()    
    class TosstStrategy{
        +pay()
    }
    class PointStrategy{
        +pay()
    }
    PaymentStrategy <|-- TosstStrategy : implements
    PaymentStrategy <|-- PointStrategy : implements