8. 전략 Strategy Pattern 개념 및 실습

Yeppi's 개발 일기·2022년 5월 13일
0

디자인패턴

목록 보기
8/8
post-thumbnail

1. 개념

객체 지향의 꽃

  • 유사한 행위들을 캡슐화 → 객체 행위를 바꾸고 싶은 경우에는 직접 변경 아닌 전략만 변경

  • 유연한 확장

  • SOLID 중 개방 폐쇄 원칙(OCP), 의존 역전 원칙(DIP)

  • 전략 method 가진 전략 객체
    Normal Strategy(인코딩하지 않는 기본), Base64 Strategy(인코딩을 사용하는 기본)

  • 전략 객체를 사용하는 컨텍스트
    → Encoder

  • 전략 객체를 생성해 컨텍스트에 주입하는
    → 클라이언트


2. 실습

  • 여러개의 전략 객체를 생성하고, 전략에 따라 달라지는 Encoder 객체를 생성
  • 객체 내부를 변경하지 않음
  • 전략을 변경하면서 객체를 선언

전략 객체를 사용할 인터페이스

  • EncodingStrategy
    • 전략 객체를 사용하는 Encoder
public interface EncodingStrategy {
    String encode(String text);
}

여러개의 전략

  • NormalStrategy
    • 인코딩 안하는 기본 기능
public class NormalStrategy implements EncodingStrategy{
    @Override
    public String encode(String text) {
        return text;
    }
}

  • Base64Strategy
    • 인코딩 기능
public class Base64Strategy implements EncodingStrategy{
    @Override
    public String encode(String text) {
        return Base64.getEncoder().encodeToString(text.getBytes());
    }
}

  • AppendStrategy
    • Append(ABCD 추가하는) 전략 객체
public class AppendStrategy implements EncodingStrategy{
    @Override
    public String encode(String text) {
        return "ABCD" + text;
    }
}


변하지 않는 객체

  • Encoder
    • 전략에 따라 message 달라짐
    • 객체 자체를 변하지 않음
public class Encoder {
    private EncodingStrategy encodingStrategy;

    public String getMessage(String message) {
        return this.encodingStrategy.encode(message);
    }
    public void setEncodingStrategy(EncodingStrategy encodingStrategy) {
        this.encodingStrategy = encodingStrategy;
    }
}


출력 결과

  • main
    • 객체(Encoder) 는 한 번만 생성
    • 여러개 전략을 생성하여, 원하는 각 전략 타입에 맞춰 객체를 사용
        // 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
profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글