1. 전략 패턴이란?

전략 패턴은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다. - 위키 백과

동일 계열의 알고리즘군을 정의하고, 각 알고리즘을 캡슐화하며, 이들을 상호교환이 가능하도록 만든다. 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로 알고리즘을 다양하게 변경할 수 있게 한다. - GoF

특정 기능이 추가될 때, 전략 객체를 생성 후 주입하는 방식으로 유연하게 기능을 확장할 수 있습니다.

전략 패턴 클래스 다이어그램

 

2. 예제 소스

1) Strategy 인터페이스 및 Strategy 클래스

//전략 인터페이스
public interface PrintStrategy {

    public void print();
}

//프린터로 전달하는 전략
public class PrinterStrategy implements PrintStrategy {

    @Override
    public void print() {
        System.out.println("Printer로 전달");
    }

}

//구글 드라이브로 전달하는 전략
public class GoogleDriveStrategy implements PrintStrategy {

    @Override
    public void print() {
        System.out.println("구글 드라이브로 전달");
    }

}

//팩스로 전달하는 전략
public class FaxStrategy implements PrintStrategy {

    @Override
    public void print() {
        System.out.println("Fax로 전달");
    }

}
각 전략 클래스들은 PrintStrategy 인터페이스를 상속하고 print() 메소드를 오버라이딩합니다.

 

2) Context 클래스

import java.util.Objects;

public class Printing {

    private PrintStrategy printStrategy;

    public void print() {
        if (Objects.nonNull(printStrategy)) {
            printStrategy.print();
        }
    }

    public void setPrintStrategy(PrintStrategy printStrategy) {
        this.printStrategy = printStrategy;
    }

}
인쇄 관련 기능을 직접 구현하지 않고 전략을 주입하는 형식으로 인쇄 기능을 수행합니다.
setPrintStrategy(PrintStrategy printStrategy) 메소드를 통해 인쇄 전략을 주입받고, print() 메소드를 통해 주입받은 전략을 수행합니다.

 

3) Client 

public class ChromeBrower extends Printing {

}
public class Main {

    public static void main(String[] args) {
        ChromeBrower chromeBrower = new ChromeBrower();
        PrintStrategy printerStrategy = new PrinterStrategy();
        PrintStrategy googleDriveStrategy = new GoogleDriveStrategy();

        chromeBrower.setPrintStrategy(printerStrategy);
        chromeBrower.print();

        chromeBrower.setPrintStrategy(googleDriveStrategy);
        chromeBrower.print();

    }

}
ChromeBrower 클래스는 Printing 클래스를 상속 받고, 다양한 전략을 주입받아서 인쇄 기능을 수행합니다.
새로운 기능이 추가되어도 PrintStrategy 전략을 생성하고 주입하는 형식으로 유연하게 기능을 확장할 수 있습니다.

참조

https://ko.wikipedia.org/wiki/%EC%A0%84%EB%9E%B5_%ED%8C%A8%ED%84%B4
https://victorydntmd.tistory.com/292

+ Recent posts