본문 바로가기
Study/CS

[CS] 디자인패턴 - 전략

by dev_kong 2023. 1. 5.
728x90
728x90

 

디자인 패턴이란?
프로그램을 설계할 때 발생했던 문제점들을 해결 할 수 있도록 하나의 규약형태로 만들어 놓은 것.

 

전략 패턴

 

전략 패턴이란?
정책 패턴이라고도 하며 객체의 행위를 바꾸고 싶은 경우 직접 수정하는 것 이아닌,
전략이라고 부르는 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주며 상호교체가 가능하게 만드는 패턴
가장 큰 예로 Passport.js 라이브러리가 있다.

 

예제 코드

패스포트를 구현 할 수는 없으니까 간략한 예시를 구현 해보자.

 

장바구니에 물건을 담고,
결제를 할 때 결제수단을 Strategy로 만드는 코드이다.

Strategy

 

package org.example.strategy;

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

 

우선 인터페이스를 만들어주자.
모든 전략은 pay라는 method를 가져야한다.

 

//Kakao

public class KakaoStrategy implements PaymentStrategy {
    private final String name;
    private final String cardNumber;
    private final String cvv;
    private final String expire;

    public KakaoStrategy(String name, String cardNumber, String cvv, String expire) {
        this.name = name;
        this.cardNumber = cardNumber;
        this.cvv = cvv;
        this.expire = expire;
    }

    @Override
    public void pay(int amount) {
        System.out.printf("카카오로 %d원 긁음%n", amount);
    }
}

// Naver

public class NaverStrategy implements PaymentStrategy{

    private final String userId;
    private final String userPw;

    public NaverStrategy(String userId, String userPw) {
        this.userId = userId;
        this.userPw = userPw;
    }

    @Override
    public void pay(int amount) {
        System.out.printf("네이버로 %d원 긁음%n", amount);
    }
}

 

실제로는 pay라는 method안에 각각의 로직을 구현하면 된다.

 

Item & ShoppingCart

 

// Item

public class Item {
    private String name;
    private 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

public class ShoppingCart {
    List<Item> items;

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

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

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

    public int getTotalPrice() {
        return items.stream()
                .map(Item::getPrice)
                .reduce(0, Integer::sum);
    }

    public void pay(PaymentStrategy paymentMethod) {
        int amount = getTotalPrice();
        paymentMethod.pay(amount);
    }
}

 

shoppingCart 에 아이템을 담고 결제하면 담겨있는 아이템들의 총 금액이
인자로 전달받은 Strategy를 통해 결제 된다.

 

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

        Item A = new Item("완두콩", 100);
        Item B = new Item("강낭콩", 200);

        shoppingCart.addItem(A);
        shoppingCart.addItem(B);

        PaymentStrategy Kakao = new KakaoStrategy("a","b","c","d");
        PaymentStrategy Naver = new NaverStrategy("asdf","qwer");

        shoppingCart.pay(Kakao);
        shoppingCart.pay(Naver);
}

 

위와 같이 실행 시킬 수 있다.

728x90
728x90

댓글