개발새발/Spring

220203_스프링입문_디자인패턴_전략 패턴_패스트캠퍼스 챌린지 11일차

막동이아빠 2022. 2. 3. 22:37

220203_스프링입문_디자인패턴_전략 패턴_패스트캠퍼스 챌린지 11일차

<2022년 02월 03일 _ 패스트캠퍼스 챌린지 11일차>

[스프링입문_디자인패턴_전략 패턴]

1. Strategy Pattern 전략 패턴

 : 객체지향의 꽃

 : 유사한 행위들을 캡슐화

 : 객체의 행위를 바꾸고 싶은 경우, 직접 변경하는 것이 아닌 전략만 변경해 유연하게 확장하는 패턴

 : SOLID중에서 개방폐쇄원칙(OCP)과 의존역전원칙(DIP)를 따름

 : 전략 메서드를 가진 전략 객체 (Normal Strategy, Base64 Strategy)

 : 전략 객체를 사용하는 컨텍스트(Encoder)

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

 

2. 실습

 (1) design 패키지에 strategy 패키지 추가 & EncodingStrategy 인터페이스 추가

 

 (2) 이러한 전략을 사용하는 NormalStrategy, Base64Strategy 클래스 추가

package com.company.design.strategy;

public class NormalStrategy implements EncodingStrategy{
    //Normal은 그대로 text return
    @Override
    public String encode(String text) {
        return text;
    }
}
package com.company.design.strategy;

import java.util.Base64;

public class Base64Strategy implements EncodingStrategy{
    //text를 인코딩하여 return
    @Override
    public String encode(String text) {
        return Base64.getEncoder().encodeToString(text.getBytes());
    }
}

 (3) 전략들을 선택할 Encoder class 추가

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;
    }
}

(5) Main문 작성

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.NormalStrategy;

public class Main {

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

        //base64
        EncodingStrategy base64 = new Base64Strategy();

        //normal
        EncodingStrategy normal = new NormalStrategy();

        String message = "hello java";

        //encoder 객체 자체는 변화하지 않고 전략에만 변화를 줘서 실행할 수 있다
        encoder.setEncodingStrategy(base64);
        String base64Result = encoder.getMessage(message);
        System.out.println(base64Result);

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

결과: Base64와 Normal에 대한 결과를 차례로 볼 수 있다

 

(6) AppendStrategy 클래스 추가

package com.company.design.strategy;

public class AppendStrategy implements EncodingStrategy{
    @Override
    public String encode(String text) {
        return "ABCD" + text;
    }
}

(8) Main문 내용 추가

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

        String message = "hello java";

        //encoder 객체 자체는 변화하지 않고 전략에만 변화를 줘서 실행할 수 있다
        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 클래스 추가
        encoder.setEncodingStrategy(new AppendStrategy());
        String appendResult = encoder.getMessage(message);
        System.out.println(appendResult);
    }
}

 

결론:

ABCD가 Append 된 결과 또한 얻을 수 있음

 

정리: 전략의 수정을 통해 실제 사용하는 객체는 그대로 두고, 전략만 수정해서 다른 결과를 얻어낼 수 있다

 (1) 전략 메서드를 가진 전략객체 (Normal Strategy, Base64Strategy, AppendStrategy 등)

 (2) 전략 객체를 사용하는 컨텍스트 (Encoder)

 (3) 전탹 객체를 생성해 컨텍스트에 주입하는 클라이언트

 

[디자인패턴] 알고 있을수록 유연하고 확장성 많은 디자인 설계를 할 수 있다!

 

11일차 강의 완료~

필기 & 내 화면 스크린샷 저장

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.