전략 패턴이란 인터페이스를 두고 클래스와 클래스를 느슨하게 연결하여
재사용할 수 있는 코드를 극대화하는 다지안 패턴 중 하나입니다.
자바, C++ 등에서 활용됩니다.
일단 예제코드를 한번 보죠.
나름 모형도 한번 만들어 봤습니다.
import java.io.File;
import java.util.ArrayList;
public class Client {
public static void main(String[] args) {
CompressionContext ctx = new CompressionContext();
//we could assume context is already set by preferences
ctx.setCompressionStrategy(new ZipCompressionStrategy());
//get a list of files...
ctx.createArchive(fileList);
}
public static class CompressionContext {
private CompressionStrategy strategy;
public void setCompressionStrategy(CompressionStrategy strategy) {
this.strategy = strategy;
}
//use the strategy
public void createArchive(ArrayList<File> files) {
strategy.compressFiles(files);
}
}
public interface CompressionStrategy {
void compressFiles(ArrayList<File> files);
}
public static class ZipCompressionStrategy implements CompressionStrategy {
public void compressFiles(ArrayList<File> files) {
}
}
public static class RarCompressionStrategy implements CompressionStrategy {
public void compressFiles(ArrayList<File> files) {
}
}
}
소스 코드는 한 클래스에 모으기 위해 전부 static으로 했습니다.
밑은 모형입니다.
흐름대로 생각해봅시다.
프로그램의 개발 도중 압축을 해야할 상황이 생겼다고 가정해 봐요.
처음에는 rar로 압축하는 코드를 짜고 계속 사용했는데
나중엔 zip을 압축해야 하는 상황이 생기고
7zip으로 압축하는 상황이 생겼습니다.
처음부터 끝까지 수행하는 작업을 종류별로 만들어 놨는데, 이대로 확장자 별로 만들게 되면 50개가 넘는 클래스가 생기고
압축 과정에서 확장자 설정 이외의 공통되는 부분이 중복되는 상황이 발생하게 됩니다.
압축 문외한이라 실제로 그런지는 모릅니다. 압축 종류별로 공통코드가 많고 확장자 설정 코드가 적다고 가정하죠.
확장자의 종류별로 처음부터 끝까지 압축과정을 끝내는 것이 너무 비효율적이라 코드를 개선하여 중복코드를 제거하고 싶습니다.
그럴 때 이 패턴을 사용하면 됩니다.
압축이라는 하나의 맥락(Context)를 쭉 진행하다가 압축 과정의 일부인 확장자 설정 문제를 맞부딪혔다고 생각해봅시다.
이 확장자 설정은 여러개의 전략(Strategy pattern)으로 해결이 가능합니다. 그 중 하나의 전략을 선택하여 다시 압축 흐름을 진행합니다.
이 전략을 선택하는 과정은 맥락(Context)에서 다수 일 수도 있습니다.
맥락이 끝날 때 까지 전략 선택 과정을 반복하면 나중엔 흐름이 완료되고, 압축이 완료되겠죠.
클라이언트 입장에서 굉장히 유연한 선택을 할 수 있게끔 도와주는 역할을 합니다.
때문에 유용하고. 자주 쓰이는 패턴입니다.
모형을 그리다보니
회사에서 인력 부족 해결 문제에 빗대면
괜찮은 비유가 되겠다 싶어서
만들어 봤습니다.
회사가 Client
인사(=인력) 채용 프로그램이 문제 해결 맥락(Context)
채용 기준이 인터페이스
취준생들이 구체적 전략들
입니다.
'프로그래밍 > Java' 카테고리의 다른 글
이펙티브 자바 규칙 10 - toString은 항상 재정의하자 (0) | 2018.02.06 |
---|---|
이펙티브 자바 규칙 9 - equal 메소드를 재정의 할 때 hashCode()도 재정의 하자 (1) | 2018.02.05 |
이펙티브 자바 규칙 8 - equals 재정의 / 오버라이드 방법 (0) | 2018.02.03 |