디자인 패턴
[디자인 패턴] 10. 전략 패턴
Song hyun
2024. 9. 27. 09:39
728x90
반응형
[디자인 패턴] 10. 전략 패턴
1. 전략 패턴이란?
(1) 전략 패턴의 개념
-전략 패턴(Strategy Pattern)은 동작 방식을 캡슐화해, 동적으로 전략을 변경할 수 있도록 하는 디자인 패턴이다.
-특정 기능을 수행할 여러 방법이 있을 때, 그 방법들을 전략으로 정의하고, 필요에 따라 적절한 전략을 사용할 수 있다.
(2) 전략 패턴의 활용 사례
-암호화/인코딩 알고리즘 : 암호화/인코딩 방식 중 동적으로 선택할 수 있게 해준다.
-게임 개발 : 캐릭터의 동적인 행동 변경 구현
-결제 처리 시스템 : 결제 방식을 동적으로 선택할 수 있는 시스템
2. 시나리오 코드
// Source code is decompiled from a .class file using FernFlower decompiler.
package strategy;
public class Strategy {
public static void main(String[] args) {
// 클라이언트 측 코드
String message = "password 1234";
// 1. 텍스트를 인코딩하는 클래스를 메모리에 올린다.
Encoder encoder = new Encoder();
// 전략 클래스 미리 생성해보기
NormalStrategy normalStrategy = new NormalStrategy();
Base64Strategy base64Strategy = new Base64Strategy();
AppendStrategy appendStrategy = new AppendStrategy();
// 전략을 선택해서 설정
encoder.setEncodingStrategy(appendStrategy);
// 기능 호출 해보기
String outputMessage1 = encoder.getMessage(message);
System.out.println(outputMessage1);
// 전략 변경해보기
encoder.setEncodingStrategy(appendStrategy);
// 두 번째 기능 호출해보기
String outputMessage2 = encoder.getMessage(message);
System.out.println(outputMessage2);
// 전략 변경해보기
encoder.setEncodingStrategy(normalStrategy);
// 세 번째 기능 호출해보기
String outputMessage3 = encoder.getMessage(message);
System.out.println(outputMessage3);
} // end of main
}
// 인코딩 전략 인터페이스
interface EncodingStrategy{
String encode(String text);
}
// 일반 텍스트를 보내는 전략 클래스 생성
class NormalStrategy implements EncodingStrategy{
@Override
public String encode(String text) {
return text;
}
}
// Base64 인코딩 전략
class Base64Strategy implements EncodingStrategy{
@Override
public String encode(String text) {
return Base64.getEncoder().encodeToString(text.getBytes());
}
}
// 특정 문자열을 추가하는 인코딩 전략
class AppendStrategy implements EncodingStrategy{
@Override
public String encode(String text) {
return text+" : "+"not base64";
}
}
// 클라이언트 클래스
class Encoder {
// 1. 추상화 (멤버)
private EncodingStrategy encodingStrategy; // 포함 관계 (Composition Relation)
// 2. 전략에 따라 메세지를 인코딩하여 반환
public String getMessage(String message){
return this.encodingStrategy.encode(message);
}
// 3. 전략을 따라서 동적으로 전략을 선택할 수 있는 기능
public void setEncodingStrategy(EncodingStrategy encodingStrategy){
this.encodingStrategy = encodingStrategy;
}
}
728x90
반응형