etc.

[Design Pattern] 전략 패턴(Strategy Pattern) / 정책 패턴(Policy Pattern)

mooni_ 2025. 4. 5. 16:43

전략(정책) 패턴(Strategy Pattern) : 행위를 직접 수정하지 않고 캡슐화한 알고리즘(전략)을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴

> 컨텍스트 : 상황, 맥락, 문맥을 의미하며 개발자가 어떠한 작업을 완료하는데 필요한 모든 관련된 정보를 말함.

 


EX) Java에서의 Strategy : 네이버페이 결제와 카카오페이 결제 등 결제 방식의 전략을 바꿔서 구현

1. PaymentStrategy : 전략 인터페이스

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

interface PaymentStrategy {
    public void pay(int amount);
}

=> 행위의 공통 구조 정의

 

2. KAKAOCardStrategy, LUNACardStrategy : 구체적인 전략

class KAKAOCardStrategy implements PaymentStrategy {
    private String name;
    private String cardNumber;
    private String cvv;
    private String datOfExpiry;

    public KAKAOCardStrategy(String name, String cardNumber, String cvv, String expiryDate) {
        this.name = name;
        this.cardNumber = cardNumber;
        this.cvv = cvv;
        this.datOfExpiry = expiryDate;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid used 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 + " pay used LUNACard.");
    }
}

=> 각각 다른 방식의 결제 전략을 정의

=> 새로운 결제 수단이 생긴다면 해당 부분을 확장하면 됨(OCP 만족)

=> 클라이언트(ShoppingCart)는 해당 전략의 구체적인 내용을 몰라도 됨

 

3. ShoppingCart : Context 클래스

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);
    }
}

=> 전략에 의존하지 않고 유연하게 결제 행동을 실시함

 

4. HelloWorld.main() : 기능 실행

public class HelloWorld {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();

        Item A = new Item("itemA", 100);
        Item B = new Item("itemB", 300);

        cart.addItem(A);
        cart.addItem(B);

        cart.pay(new LUNACardStrategy("email@test.com", "testpassword"));

        cart.pay(new KAKAOCardStrategy("mooni", "0000-0000-0000-0000", "000", "12/01"));
    }
}

=> ShoppingCart에 결제 전략을 외부에서 주입함으로써 결제 수단을 선택적으로 바꿀 수 있음