CNOW 2024. 12. 11. 14:03
💡 학습 목표


  1. 전략 패턴의 개념과 사용 목적을 설명할 수 있다.
  2. 전략 패턴을 적용한 코드를 작성하고, 동작 방식을 설명할 수 있다.
  3. 전략 패턴이 필요한 상황과 그 장점을 설명할 수 있다.

 

사전 기반 지식

  • 인터페이스와 다형성: 인터페이스를 사용하여 서로 다른 구현체를 동일하게 처리하는 개념을 이해해야 합니다.
  • 메서드 오버라이딩: 상위 클래스나 인터페이스에서 정의된 메서드를 하위 클래스에서 재정의하여 사용하는 방법을 알고 있어야 합니다.

 

전략 패턴 이란(Strategy Pattern)?

전략 패턴(Strategy Pattern)은 동작 방식을 캡슐화하여, 동적으로 전략을 변경할 수 있도록 하는 디자인 패턴입니다. 특정 기능을 수행할 여러 방법이 있을 때, 그 방법들을 전략(클래스)으로 정의하고, 필요에 따라 적절한 전략을 선택하여 사용할 수 있습니다.

 

package strategy;

import java.util.Base64;

public class StrategyTest {

    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(base64Strategy);

        // 기능 호출해보기 
        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";
    }
}
// 도전 과제 1 
// HTML 인코딩 전략을 만들어 주세요 
// http://localhost:8080/a?name=%22%ED%99%8D%EA%B8%B8%EB%8F%99%22

// 도전 과제 2 
// Base64 디코딩 클래스를 설계하시오 


// 핵심 ! -  클라이언트 클래스 
class Encoder {

    // 1. 추상화 (멤버 )
    private EncodingStrategy encodingStrategy;

    // 2. 
    // 전략에 따라 메세 지를 인코딩하여 반환 
    public String getMessage(String message) {
        return this.encodingStrategy.encode(message);
    }

    // 3.
    // 전략을 따라서 동적으로 전략을 선택할 수 있는 기능 
    public void setEncodingStrategy(EncodingStrategy encodingStrategy) {
        this.encodingStrategy = encodingStrategy;
    }
}