[cs 스터디] 1-1. 디자인 패턴 - 전략 패턴

YooJeeun·2024년 12월 26일

cs 스터디

목록 보기
3/65

전략 패턴(strategy pattern)

전략패턴은 정책 패턴(policy 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.
*/
1. PaymentStrategy 인터페이스
  • 결제 전략을 정의하는 인터페이스
    모든 구체적인 결제 전략 클래스는 이 인터페이스를 구현한다.
    interface PaymentStrategy { public void pay(int amount); }
2. KAKAOCardStrategy, LUNACardStrategy 클래스
  • 각각 결제 방법을 구현한 전략 클래스
    결제 방식을 캡슐화하며 pay 메서드를 통해 결제 행위를 정의한다.

    전략 패턴의 주요 특징

    1. 유지보수 용이

    전략 패턴을 사용하면 결제 방법이 서로 독립적이기 때문에 새로운 결제 방법을 추가하거나 기존 결제 방법을 변경할 때애ㅔ도 코드 변경이 최소화 된다.

    2. 확장성

    새로운 결제 방식이 필요할 때 새로운 전략 클래스만 추가하면 되므로 확장이 용이하다.

    3. 결합도 낮춤

    전략 패턴을 통해 클라이언트 코드와 구체적인 결제 방식 간의 결합도를 줄일 수 있다.

사용자의 요청에 대해 인증을 수행하는 다양한 전략을 제공하는 Node.js의 미들 웨어 라이브러리 Passport.js가 있다.

profile
제니벨로그

0개의 댓글