본문 바로가기
기술면접/디자인 패턴

[디자인 패턴] 전략 패턴

by illlilillil 2022. 4. 5.
  • 전략 패턴이란?
    • 다양한 전략을 바꿔가며 해결하는 패턴
    • 인터페이스와 위임을 사용해 특정 기능 변경을 할 때 사용하는 패턴
    • 위임으로 IOC(제어의 역전), 인터페이스로 OCP를 만족할 수 있다.
    • 언제 쓰는가?
      • 게임에서 무기를 선택할때 칼,창,도
      • 등급 할인 정책
      • 자바에서 쓰이는 경우
        • Collections#sort()
        • javax.servlet.http.HttpServlet
        • javax.servlet.Filter#doFilter()
    • 장점
      • Context의 변경 없이 새 전략을 추가할 수 있다.
      • 확장에 유리한 코드 작성
    • 단점
      • 클래스로 분리한 각 전략들이 어느 상황에 사용되는지 알아야 함.
      • 구체 클래스에선 인터페이스에 있는 메서드를 쓰지 않을 수도 있기에 비효율적일 수 있다.
  • 구현해보기

상황: PM, 개발자, 개발 도구 전략 2가지(이클립스, 인텔리제이)

  1. 레거시가 익숙한 PM은 이클립스를 이용한 개발을 지시한다..
  2. PM이 이클립스 사용
  3. 요구 사항이 바뀌어 인텔리제이로의 전환을 지시한다
  4. 전략 패턴으로 구현했기 때문에 코드 수정없이 전환이 가능해진다

 

Strategy

public interface Strategy {
    String useTool();
}

public class StrategyEclipse implements Strategy{
    @Override
    public String useTool() {
        return "Use Eclipse";
    }
}

public class StrategyIntelij implements Strategy{
    @Override
    public String useTool() {
        return "Use Intelij";
    }
}

Develop(Context)

public class Developer {
    private Strategy strategy;
    public Developer(Strategy strategy) {
        this.strategy = strategy;
    }

    public String choose() {
        return "Developer choose a tool -> " + strategy.useTool();
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
}

Manager

public class Manager {
    public static void main(String[] args) {
        Developer developer = new Developer(new StrategyEclipse());
        System.out.println(developer.choose());
				//전환 지시
        developer.setStrategy(new StrategyIntelij());
        System.out.println(developer.choose());
    }
}
  • 스프링에서 전략 패턴

JDBC의 DB Connection 단계에서 전략 패턴이 활용된다.

DataSourceBuilder에 DB 설정 정보들이 들어가 있는 것으로 보인다.

프로젝트에서 H2, Postresql을 써서 저렇게 나오는 것 같다

우측 사진이 전략 패턴을 구성하는 JDBC Interface로 보여진다.

댓글