디자인 패턴

[디자인 패턴] 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
반응형