Strategy Pattern
전략 패턴은 객체지향의 꽃이라고 불립니다.
객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고 유사한 행위들을 캡슐화하여,
알고리즘을 별도로 분리하는 설계 방법을 의미합니다.
컨텍스트(Context) 클래스에 전략 객체를 담아서 사용하게 됩니다.
객체의 행위를 바꾸고 싶은 경우 컨텍스트(Context)를 직접 변경하는 것이 아닌
전략만 변경하여, 유연하게 확장하는 패턴입니다.
SOLID 중에서 개방폐쇄 원칙(OCP)과 의존 역전 원칙(DIP)를 따릅니다.
전략 패턴의 단점
- Context(전략 사용자)의 코드 변경 없이 새로운 전략을 추가 할 수 있습니다.
- 확장에 유리한 코드를 작성할 수 있습니다..
- 런타임에 전략을 변경시킬 수 있습니다.
전략 패턴의 단점
- 어플리케이션에 들어가는 모든 전략을 알고 있어야 합니다.
- 전략을 추상화한 인터페이스가 효율적이지 못할 수 있습니다.
전략 패턴 구현 예시
우선 전략 객체들의 행위(전략 메서드)를 정의할 인스턴스를 만듭니다.
// EncodingStrategy.java
public interface EncodingStrategy {
String encoding(String message);
}
// NormalStrategy.java
public class NormalStrategy implements EncodingStrategy {
@Override
public String encoding(String message) {
return message;
}
}
전략 메서드를 가진 전략 객체 NormalStrategy
// Base64Strategy.java
import java.util.Base64;
public class Base64Strategy implements EncodingStrategy {
@Override
public String encoding(String message) {
return Base64.getEncoder().encodeToString(message.getBytes());
}
}
전략 메서드를 가진 전략 객체 Base64Strategy
// Encoder.java
public class Encoder {
private EncodingStrategy encodingStrategy;
public void setEncodingStrategy(EncodingStrategy encodingStrategy){
this.encodingStrategy = encodingStrategy;
}
public String getMessage(String message){
return encodingStrategy.encoding(message);
}
}
전략 객체를 사용하는 컨택스트(Encoder).
컨택스트는 전략 객체를 담는 용도로 쓰이며,
컨택스트 클래스를 통해서 인스턴스를 생성하여, 전략 메소드를 호출하게 됩니다.
// Main.java
public class Main {
public static void main(String[] args) {
Encoder encoder = new Encoder();
String message = "hello Java";
encoder.setEncodingStrategy(new NormalStrategy());
String normalResult = encoder.getMessage(message);
System.out.println(normalResult); // hello Java
encoder.setEncodingStrategy(new Base64Strategy());
String base64Result = encoder.getMessage(message);
System.out.println(base64Result); // aGVsbG8gSmF2YQ==
}
}
전략 객체를 사용하는 컨택스트 Encoder 객체의 코드 변경없이,
컨택스트 객체에 전략 객체(NormalStrategy, Base64Strategy)를 메소드로 입력받음으로써,
전략 객체에 기술된 결과값을 출력합니다.
즉, 전략의 수정을 통해서 다른 결과값을 얻어낼 수 있습니다.
이러한 디자인 패턴을 통해서 유연하고 확장성이 가능한 구조를 만들 수 있습니다.
참고 사이트
'Java' 카테고리의 다른 글
java - GET API (0) | 2021.08.26 |
---|---|
java - api 프로젝트 만들기 (0) | 2021.08.25 |
java - 파사드 패턴(구조 패턴) (0) | 2021.08.24 |
java - 옵저버 패턴(행위 패턴) (0) | 2021.08.23 |
java - 데코레이터 패턴(구조 패턴) (0) | 2021.08.23 |
댓글