Computer Science/Design Pattern

전략패턴 (Strategy Pattern)

by Donghwan 2023. 1. 29.
  • 특정한 계열 또는 행위를 Interface로 캡슐화하고 구체적으로 구현된 알고리즘을 상호 교체가 가능하도록 만드는 패턴입니다.
  • 전략패턴을 사용하면 기능이 추가 또는 변경 되더라도 기존 클래스의 수정이 아닌 Interface의 구현을 통해 확장하여 해결 할 수 있어 OCP 원칙을 지킬 수 있습니다.
  • Context는 전략을 실제로 사용하는 사용자의 입장입니다. 이때 A라는 상황에는 ConcreateStrategy1, B라는 상황에는 ConcreateStrategy2를 사용하도록 구성할 수 있습니다.

public class AppMain {
    /*
     * 예제의 설정
     * Android와 Ios Mobile 개발자가 있는데 각각 프로젝트에서 2가지 언어를 사용한다는 가정입니다.
     * 인스턴스가 개발자의 숫자를 의미하도록 상황을 부여하고 객체는 각 상황에서 1명씩 존재한다는 가정입니다.
     */

    public static void main(String[] args) {
        /*
         * Not Strategy
         * 전략 패턴을 적용하지 않은 경우, 언어 변경에 따라서 각 클래스를 직접 수정해야 하는데 이러한 경우는 OCP 원칙에 위배됩니다.
         * 그리고 언어의 갯수가 2개가 아닌 N개가 될 경우 매번 수정을 해야하는 비효율이 발생합니다.
         */
        NotStrategyDeveloper notStrategyAndroidDeveloper = new NotStrategyAndroidDeveloper();
        notStrategyAndroidDeveloper.coding();

        NotStrategyDeveloper notStrategyIosDeveloper = new NotStrategyIosDeveloper();
        notStrategyIosDeveloper.coding();

        /*
         * Strategy
         * 전략 패턴을 적용한 경우, CodingBehavior라는 Interface로 개념을 캡슈화하였습니다.
         * 따라서 AndroidDeveloper와 IosDeveloper는 동일한 Instance에서 전략의 종류만 갈아끼워준다면 동적으로 Coding 전략을 변경할 수 있습니다.
         * 언어가 N개가 되더라도 Developer 클래스를 직접 수정하는 것이 아니라 전략의 확장을 통해 해결하기 때문에 OCP 원칙을 지킬 수 있습니다.
         */
        CodingBehavior androidWithJavaBehavior = new AndroidWithJavaBehavior();
        CodingBehavior androidWithKotlinBehavior = new AndroidWithKotlinBehavior();
        CodingBehavior iosWithObjectCBehavior = new IosWithObjectCBehavior();
        CodingBehavior iosWithSwiftBehavior = new IosWithSwiftBehavior();

        StrategyDeveloper androidDeveloper = new StrategyAndroidDeveloper(androidWithJavaBehavior);
        androidDeveloper.coding();
        androidDeveloper.setCodingBehavior(androidWithKotlinBehavior);
        androidDeveloper.coding();
        androidDeveloper.setCodingBehavior(androidWithJavaBehavior);
        androidDeveloper.coding();

        StrategyDeveloper iosDeveloper = new StrategyIosDeveloper(iosWithObjectCBehavior);
        iosDeveloper.coding();
        iosDeveloper.setCodingBehavior(iosWithSwiftBehavior);
        iosDeveloper.coding();
        iosDeveloper.setCodingBehavior(iosWithObjectCBehavior);
        iosDeveloper.coding();
    }
}
 

GitHub - dev-donghwan/donghwan-study: donghwan-personal-study-repository

donghwan-personal-study-repository. Contribute to dev-donghwan/donghwan-study development by creating an account on GitHub.

github.com

 

728x90
반응형

'Computer Science > Design Pattern' 카테고리의 다른 글

관찰자패턴 (Observer Pattern)  (0) 2023.01.29
Singleton Pattern  (0) 2022.01.15
[Design Pattern] Proxy Pattern  (0) 2021.08.18
[Design Pattern] Template Method Pattern  (0) 2021.08.03
[Design Pattern] Strategy Pattern  (0) 2021.08.03

댓글