디자인 패턴 - 전략 패턴

namkun·2022년 9월 26일
0

디자인 패턴

목록 보기
3/3

전략 패턴?

전략 패턴은 객체가 할 수 있는 행위를 각각 전략으로 만들어 놓은 뒤, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것 만으로 행위의 수정을 가능하도록 만드는 패턴이다.

자세하게 말하자면, 객체들이 할 수 있는 행위(ex> 버스의 운전, 인간의 식사)에 대해서 각각 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 따로 정의하여 객체의 행위를 동적으로 바꾸고 싶을 때 직접적으로 행위를 수정하지 않고, 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하게 하는 패턴이다.

코드로 보자.

필요할 때마다 Payment 방법을 만드는 코드를 작성할 예정이다.

PaymentStrategy.java

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

NaverPay.java

public class NaverPay implements PaymentStrategy {
    private final String name;
    private final String cardNumber;
    private final String cvv;
    private final String expireDate;

    public NaverPay(String name, String cardNumber, String cvv, String expireDate) {
        this.name = name;
        this.cardNumber = cardNumber;
        this.cvv = cvv;
        this.expireDate = expireDate;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " won paid by naver pay");
    }
}

KakaoPay.java

public class KakaoPay implements PaymentStrategy{
    private final String kakaoId;
    private final String passWord;
    private final int balance;

    public KakaoPay(String kakaoId, String passWord, int balance) {
        this.kakaoId = kakaoId;
        this.passWord = passWord;
        this.balance = balance;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " won paid by kakao pay, balance : " +  (balance-amount));
    }
}

Item.java

public class Item {
    private final String name;
    private final int price;

    public Item(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName(){
        return name;
    }

    public int getPrice(){
        return price;
    }
}

ShoppingCart.java

import java.util.*;

public class ShoppingCart {
    List<Item> items;

    public ShoppingCart(){
        this.items = new ArrayList<>();
    }

    public void addItem(Item item){
        this.items.add(item);
    }

    public void removeItem(Item item){
        this.items.remove(item);
    }

    public int calculateTotalPrice(){
        return items.stream().mapToInt(Item::getPrice).sum();
    }

    public void pay(PaymentStrategy paymentStrategy){
        int amount = calculateTotalPrice();
        paymentStrategy.pay(amount);
    }
}

PaymentApplication.java

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

        Item FROG = new Item("frog", 320000);
        Item F284 = new Item("f284", 580000);

        shoppingCart.addItem(F284);
        shoppingCart.addItem(FROG);
		
        // 네이버페이 사용시
        shoppingCart.pay(new NaverPay("nhkim", "12345678", "123", "20220801"));
        
        // 카카오페이 사용시
        shoppingCart.pay(new KakaoPay("namkun","q1w2e3r4", 1000000));
    }
}

우리는 이제 필요한 카카오페이와 네이버페이라는 두 개의 전략을 이용해서 결제할 수 있다.

profile
개발하는 중국학과 사람

0개의 댓글