ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DESIGN PATTERN] Strategy 패턴
    study/design pattern 2020. 8. 30. 18:01

    스트레티지 패턴 ( Strategy pattern )

    지정된 알고리즘의 세부 구현을 변경할 필요없이 쉽게 교환할 수 있는 디자인 패턴이다.

    실행 중이라도 구현된 알고리즘을 교환할 수 있으므로 의존성 주입에 자주 사용된다.

     

    아래는 Strategy 패턴을 통해 간단한 로거를 만드는 예제이다.

    public interface Logging {
        void write(String message);
    }
    public class ConsoleLogging implements Logging {
        @Override
        public void write(String message) {
            System.out.println(message);
        }
    }
    public class FileLogging implements Logging {
    
        private final File toWrite;
    
        public FileLogging(File toWrite) {
            this.toWrite = toWrite;
        }
    
        @Override
        public void write(String message) {
            try(final FileWriter fos = new FileWriter(toWrite)){
                fos.write(message);
    
            }catch (IOException ioe){
                ioe.printStackTrace();
            }
        }
    }

     

    Logging 인터페이스를 사용해 로그 기록을 콘솔에 출력하는지 파일에 기록하는지 신경쓰지 않고 개발할 수 있도록 해준다.

    즉, 특정 구현을 활용하지 않고 인터페이스를 활용해 코드를 테스트할 때는 ConsoleLogging 클래스를 사용하고 실제로 사용할 때는 FileLogging 클래스를 사용할 수 있도록 하였다.

    이는 나중에 Logging 인터페이스에 다른 구현을 추가할 때 작성한 코드를 수정하지 않고도 새로운 구현을 활용할 수 있는 기반이 된다.

    public class StrategyMain {
        public static void main(String[] args) throws IOException {
            StrategyMain strategyMain = new StrategyMain();
            strategyMain.useConsoleLogging();
            strategyMain.useFileLogging();
        }
    
        public void useConsoleLogging(){
            final Client c = new Client(new ConsoleLogging());
            c.doWork(32);
        }
    
        public void useFileLogging() throws IOException {
            final File tempFile = File.createTempFile("test", "log");
            final Client c = new Client(new FileLogging(tempFile));
            c.doWork(41);
            c.doWork(42);
            c.doWork(43);
    
            final BufferedReader br = new BufferedReader(new FileReader(tempFile));
            if("Even number : 42".equals(br.readLine()))
                System.out.println("correct");
    
        }
    }

     

    예를 들기위해 로깅을 사용했지만 이런 방식으로 로그를 남기면 안된다.
    직접 로거를 만들어야 한다.
    자바에서는 Log4J나 SLF4J 같은 로그 출력 전용 라이브러리가 많다.

     

    정리

    같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화하는 인터페이스를 정의하고 이들이 필요할 때 갈아끼우며 같은 문제를 다르게 해결할 수 있도록 해주는 패턴이다.

    무엇보다 stratgy 패턴을 사용했을 때의 장점은 실행하기 전까지 어떤 구현을 사용할지 결정을 미룰 수 있다는 점이다.

    앞에서 구현한 로깅 외에 실제로 볼 수 있는 또 다른 예는 스프링 프레임워크다.

    객체나 의존성을 생성할 때 xml 파일을 사용하며 웹 애플리케이션을 실행할 때 이 파일을 먼저 읽어온다.

    사용자는 xml 파일의 내용을 변경하면 다시 컴파일할 필요없이 다른 구현 방법을 이용할 수 있다.

     

     

    'study > design pattern' 카테고리의 다른 글

    [DESIGN PATTERN] 템플릿 메서드 패턴  (0) 2020.08.30
    [DESIGN PATTERN] 빌더 패턴  (0) 2020.08.30
Designed by Tistory.