본문 바로가기
디자인패턴/행위

[디자인패턴]전략 패턴

by se0nghyun2 2023. 3. 3.
더보기

행위패턴: 객체 간 더 나은 상호작용, 책임 분배 방법 제공하는 패턴

 향후 쉽게 확장할 수 있는 유연성에 대한 솔루션을 제공한다.

 

전략 패턴

전략이란 특정한 목표를 수행하기 위한 행동 계획 이라 한다.

1. 특정한(유사한) 목표를 수행하기 위한 행위들을 정의

2. 확장에 있어서 유연성을 위해 인터페이스 또는 추상클래스

두가지를 종합해보면,

인터페이스를 두고, 그것을 구현 받은 객체 내 유사한 행위를 수행하도록 설계하는 디자인 패턴

=>특정 컨텍스트에서 알고리즘을 별도로 분리하는 설계 방법

 

 

전략패턴 구조


결제 진행 시 간편결제 수단 별 결제 방식이 상이하다.

Naver는 카드번호를 통해서, Kakao는 가상otc번호를 통해서 결제한다고 가정한다.

여기서 컨텍스트는 결제이다.

 

클린하지않은 코드

public class PayService{
	
    public void pay(String cardNum){
    	if(isNaver()) {
        	//네이버페이 결제 로직
        }else if(is Kakao()){
        	//카카오페이 결제 로직
        }else{
        	//일반카드 결제로직
        }
     }
}

위 코드를 보면 문제점이 있다.

1. OCP 위반 - 새로운 결제 수단 추가 시 기존 로직에 else if 구문을 추가해야 한다.

2. PayService클래스에서 너무 많은 의미를 지님 (네이버페이,카카오페이,일반결제도 담당..)

3. 모든 간편수제별 카드번호 16자리 체크 정책이 추가된다면 모든 if else구문마다 추가해줘야 한다.

 

 

 

전략 패턴 적용한 코드

public class PayService{
	PayStrategy payStrategy;
    
    //전략 세팅
    public void setPayStrategy(PayStrategy payStrategy){
    	this.payStrategy=payStrategy;
    }
    
    public void pay(String cardNum){
    	tis.payStrategy.pay(cardNum); // 각 구현체별 로직 수행
     }
}


public class KakaoPayStrategy implments PayStragety{
    @Override
    public void pay(String cardNum){
    	//카카오페이 결제 로직
     }
 }
 
 public class NaverPayStrategy implments PayStragety{
    @Override
    public void pay(String cardNum){
    	//네이버페이 결제 로직
     }
 }
public class main{
	public static void main(String[] args){
    	..
        PayService payService = new PayService();
        //전략 세팅
        payService.setPayStragety(new KakaoStragety);
        payService.pay(cardNum);
}

 

 

1. OCP 위반 - 새로운 결제 수단 추가 시 기존 로직에 else if 구문을 추가해야 한다.

   => 기존 로직 수정 없이 클래스 추가 ex) PaycoStrategy 추가

2. PayService클래스에서 너무 많은 의미를 지님 (네이버페이,카카오페이,일반결제도 담당..)

 =>각 클래스별로 의미 명확 (카카오 결제, 네이버 결제..)

3. 모든 간편수제별 카드번호 16자리 체크 정책이 추가된다면 모든 if else구문마다 추가해줘야 한다.

 -> 어라? 이 문제를 여전히 안고 있다. 공통된 로직 도 있고 각 클래스별 세부적으로 구현할 로직도 있으니 템플릿 메소드 패턴을       쓰면 될 거 같다!!


근데 의미 중에  

실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴 이런것도 있는데 이거의 의미가 뭘까?

서비스 돌아가면서도 내가 새로운 전략을 넣을 수 있다는건가(setStrategy)?

해당 서비스의 서버를 재구동진행하지 안하고?