객체 지향의 꽃
유사한 행위들을 캡슐화 → 객체 행위를 바꾸고 싶은 경우에는 직접 변경 아닌 전략만 변경
유연한 확장
SOLID 중 개방 폐쇄 원칙(OCP), 의존 역전 원칙(DIP)
전략 method 가진 전략 객체
→ Normal Strategy
(인코딩하지 않는 기본), Base64 Strategy
(인코딩을 사용하는 기본)
전략 객체를 사용하는 컨텍스트
→ Encoder
전략 객체를 생성해 컨텍스트에 주입하는
→ 클라이언트
public interface EncodingStrategy {
String encode(String text);
}
public class NormalStrategy implements EncodingStrategy{
@Override
public String encode(String text) {
return text;
}
}
public class Base64Strategy implements EncodingStrategy{
@Override
public String encode(String text) {
return Base64.getEncoder().encodeToString(text.getBytes());
}
}
public class AppendStrategy implements EncodingStrategy{
@Override
public String encode(String text) {
return "ABCD" + text;
}
}
public class Encoder {
private EncodingStrategy encodingStrategy;
public String getMessage(String message) {
return this.encodingStrategy.encode(message);
}
public void setEncodingStrategy(EncodingStrategy encodingStrategy) {
this.encodingStrategy = encodingStrategy;
}
}
// Encoder 객체 자체는 달라지지 않고, 전략에 따라 각기 다른 결과 출력
Encoder encoder = new Encoder();
// 전략 세팅
EncodingStrategy base64 = new Base64Strategy();
EncodingStrategy normal = new NormalStrategy();
// 전략에 따른 결과 확인
String message = "hello java";
encoder.setEncodingStrategy(normal);
String normalResult = encoder.getMessage(message);
System.out.println(normalResult); // 출력 : hello java
encoder.setEncodingStrategy(base64);
String base64Result = encoder.getMessage(message);
System.out.println(base64Result); // 출력 : aGVsbG8gamF2YQ==
encoder.setEncodingStrategy(new AppendStrategy());
String appendResult = encoder.getMessage(message);
System.out.println(appendResult); // 출력 : ABCDhello java