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
'소프트웨어-이야기 > 프로그래밍 언어와 프레임워크' 카테고리의 다른 글
[ChatGPT] Function calling (0) | 2023.07.25 |
---|---|
ChatGPT에게 IfNecessary, IfNeeded 함수명의 차이를 물어보다. (0) | 2023.03.04 |
Enum 활용하기 (0) | 2023.01.07 |
Lombok 기본 생성자와 Getter/Builder 어노테이션 (1) | 2022.11.12 |
JPA Entity와 Lombok Annotation (1) | 2022.10.29 |