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
'IT > 디자인 패턴' 카테고리의 다른 글
[Design Pattern] 데코레이터 패턴 (Decorator Pattern) (0) | 2020.10.28 |
---|---|
[Design Pattern] 추상 팩토리 패턴(Abstract factory pattern) (0) | 2020.10.27 |
[디자인 패턴] 팩토리 메소드 패턴 (0) | 2020.10.19 |
[디자인 패턴] 템플릿 메소드 패턴(Template Method Pattern) (0) | 2020.10.16 |
[디자인 패턴] 프록시 패턴 (Proxy Pattern) (0) | 2020.10.15 |