ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [디자인 패턴] 전략 패턴 (Strategy)
    백엔드/객체지향 | 디자인패턴 2023. 1. 29. 09:55
    반응형

     

    전략 패턴은 특정 행동을 할 수 있는 알고리즘이 여러가지일 때, 프로그램을 실행 중에 알고리즘을 선택할 수 있도록 하는 패턴이다.

     

    위 문장만 보면 이해하기 어렵지만, 알고보면 간단한 패턴으로 개방-폐쇄 원칙(OCP)을 지킬 수 있도록 도와주는 디자인 패턴이다.

    만약 어떤 물건을 사고 결제를 할 때, 현금 결제나 카드 결제, 카카오페이를 선택할 수 있다. 

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class consumer {
     
        public void credit(int strategy, int money) {
            if (strategy == 1) {
                현금 결제
            } else if (strategy == 2) {
                카드 결제
            } else if (strategy == 3) {
                카카오페이 결제
            }
        }
     
    }
    cs

     

    위처럼 코드를 작성하고 끝내버리면 문제가 없겠지만, 나중에 카카오페이 기능이 변경된다면 코드를 볼 필요 없는 현금, 카드를 봐야한다. 게다가 토스 결제나 삼성 페이 결제 방식이 추가된다면 한 메서드에 많은 분량의 코드가 나와 코드 변경에 유연해지지 않게 된다.

     

    이 문제를 해결하려면 결제 전략을 나누어야 한다. 하나는 손으로 직접 전달해 결제하는 전략과 휴대폰을 사용하여 결제하는 전략으로 나눌 수 있다.

     

    이렇게 결제 전략을 추상화하여 상황에 맞게 결제하는 방법을 선택할 수 있게 된다.

    여기서 추상화를 한 CreditStrategy를 전략이라고 부르고, HandStrategy, PhoneStrategy는 콘크리트 클래스라고 부른다. 마지막으로 결제할 때 금액을 확인하는 책임을 가진 Consumer는 콘텍스트라고 부른다.

    전략 패턴을 사용할 경우, 콘텍스트는 사용할 전략을 직접 선택하지 않는다. 대신 콘텍스트의 클라이언트가 콘텍스트에게 사용할 전략을 알려주는 의존성 주입(DI)을 이용한다.

     

    그래서 Consumer의 코드를 살펴보면 아래와 같다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class Consumer {
     
        private CreditStrategy creditStrategy;
     
        public Consumer(CreditStrategy creditStrategy) {
            this.creditStrategy = creditStrategy;
        }
     
        public void credit(List<Item> items) {
            int totalMoney = 0;
            
            for (Item item : items) {
                totalMoney += item.getPrice();
            }
            
            creditStrategy.withdraw(totalMoney);
        }
    }
    cs

     

    만약 카카오페이에 기능 변경이 생기더라도 콘텍스트(Consumer)에는 코드 변경이 일어나지 않는다. 마찬가지로 생체인식을 통해 결제하는 새로운 전략이 추가되어도 콘텍스트 코드는 바뀌지 않는다.

     

    전략 패턴은 동일한 기능을 제공하는 알고리즘이 다를 경우 사용하면 매우 용이하다.

    반응형

    댓글

Designed by Tistory.