디자인패턴 8. Strategy Pattern

min seung moon·2021년 6월 25일
0

Spring

목록 보기
13/50

1. Strategy Pattern

  • Strategy Pattern는 전략 패턴으로 불리며, 객체지향의 꽃이다
  • 유사한 행위들을 캡슐화하여, 객체의 행위를 바꾸고 싶은 경우 직접 변경하는 것이 아닌 전략만 변경하여, 유연하게 확장하는 패턴, SOLID 중에서 개방폐쇄 원칙(OCP)과 의존역전 원칙(DIP)를 따른다.
  • 만들 예제
    • 전략 메서드를 가진 전략 객체(Normal Strategy, Base64 Stratege)
    • 전략 객체를 사용하는 컨텍스트(Encoder)
    • 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트

2. 프로젝트 테스트

  • Package : strategy

  • Interface : EncodingStrategy

  • Class : NormarStrategy, Base64Strategy, Encoder, AppendStrategy

  • EncodingStrategy.java

package com.company.design.strategy;

public interface EncodingStrategy {
    String encode(String text);
}
  • NormarStrategy.java
package com.company.design.strategy;

public class NormarStrategy implements EncodingStrategy{
    @Override
    public String encode(String text) {
        return text;
    }
}
  • Base64Strategy.java
package com.company.design.strategy;

import java.util.Base64;

public class Base64Strategy implements EncodingStrategy{

    @Override
    public String encode(String text) {
        return Base64.getEncoder().encodeToString(text.getBytes());
    }
}
  • Encoder.java
package com.company.design.strategy;

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.java
package com.company.design;

import com.company.design.strategy.Base64Strategy;
import com.company.design.strategy.Encoder;
import com.company.design.strategy.EncodingStrategy;
import com.company.design.strategy.NormarStrategy;

public class Main {

    public static void main(String[] args) {
        Encoder encoder = new Encoder();

        // base64
        EncodingStrategy base64 = new Base64Strategy();

        // normal
        EncodingStrategy normal = new NormarStrategy();

        String message = "hello java";

        encoder.setEncodingStrategy(base64);
        String base64Result = encoder.getMessage(message);
        System.out.println(base64Result);

        encoder.setEncodingStrategy(normal);
        String normalResult = encoder.getMessage(message);
        System.out.println(normalResult);
    }
}

  • AppendStrategy.java
package com.company.design.strategy;

public class AppendStrategy implements EncodingStrategy{
    @Override
    public String encode(String text) {
        return "ABCD"+text;
    }
}
  • Main.java
package com.company.design;

import com.company.design.strategy.*;

public class Main {

    public static void main(String[] args) {
        Encoder encoder = new Encoder();

        // base64
        EncodingStrategy base64 = new Base64Strategy();

        // normal
        EncodingStrategy normal = new NormarStrategy();

        String message = "hello java";

        encoder.setEncodingStrategy(base64);
        String base64Result = encoder.getMessage(message);
        System.out.println(base64Result);

        encoder.setEncodingStrategy(normal);
        String normalResult = encoder.getMessage(message);
        System.out.println(normalResult);

        encoder.setEncodingStrategy(new AppendStrategy());
        String appendResult = encoder.getMessage(message);
        System.out.println(appendResult);
    }
}

profile
아직까지는 코린이!

0개의 댓글