- 특정한 계열 또는 행위를 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();
}
}
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 |
댓글