전략 패턴은 객체지향의 꽃이라고 불린다고 한다.

 

유사한 행위들을 캡슐화 하여 객체의 행위를 변경하고 싶은 경우 직접 변경이 아닌 전략만 변경하여

유연하게 확장하는 패턴이다.

 

 

동일한 값으로 호출하는 동일하게 요청하는 데이터를 각각 다른 encoding 방법을 변경하여,

즉 요청은 동일하지만, 내부적으로 사용하는 전략만 변경하여 사용하는 방법이다.

 

세가지 전략패턴을 만들어보자.

 

먼저 인코더 클래스를 만든다.

해당 인코더는 인코딩 전략을 세팅하는 set 메서드와 , 해당 인코더로 세팅된 메세지를 리턴하는 get 메서드를 가지고 있다.

public class Encoder {
    private EncodingStrategy encodingStrategy;

    public String getMessage(String message){
        return this.encodingStrategy.encode(message);
    }

    public void setEncodingStrategy(EncodingStrategy encodingStrategy){
        this.encodingStrategy =encodingStrategy;
    }
}

 

그럼 위의 인코더를 활용할 여러가지 패턴의 인코더를 만들자.

인코더들은 먼저 EncodingStrategy 인터페이스를 활용하여 encode 메서드를 구현하게 된다.

먼저, 해당 메세지 앞에 ABCD 값을 Append 하는 AppendStrategy 클래스를 만든다.

 

public class AppendStrategy implements EncodingStrategy{

    @Override
    public String encode(String text) {
        return "ABCD" + text;
    }
}

 

다음으로는 Base64로 인코딩하는 Base64Strategy 클래스를 만든다.

 

public class Base64Strategy implements EncodingStrategy{

    @Override
    public String encode(String text) {
        return Base64.getEncoder().encodeToString(text.getBytes());
    }
    
}

위의 메서드를 호출해서 결과를 확인해보자.

 

   /******************** 전략 패턴 ***********************/
        
        Encoder encoder = new Encoder();
        
        String message = "hello java";
        
		//base64
        encoder.setEncodingStrategy(new Base64Strategy());
        String base64Result = encoder.getMessage(message);
        System.out.println(base64Result);

		//append
        encoder.setEncodingStrategy(new AppendStrategy());
        String appendResult = encoder.getMessage(message);
        System.out.println(appendResult);
        
        
/*********************** 결과 ********************/

aGVsbG8gamF2YQ==
ABCDhello java

 

이렇게 동일한 값이지만, 전략을 다르게 함으로써 다른 결과값을 낼 수도 있다.
많이 사용하는 디자인 패턴이므로 잘 알아둘 것!

 

 

참고

- 패스트캠퍼스 예상국 Backend Developer님 강의(Spring초격차)

 

 

+ Recent posts