전략 패턴
전략 패턴에서는 클래스 또는 해당 알고리즘의 동작이 런타임에 변경될 수 있습니다. 이러한 유형의 디자인 패턴은 행동 패턴입니다.
전략 패턴에서는 다양한 전략을 나타내는 객체와 전략 객체가 변경됨에 따라 동작이 변경되는 컨텍스트 객체를 생성합니다. 전략 개체는 컨텍스트 개체의 실행 알고리즘을 변경합니다.
Introduction
의도: 일련의 알고리즘을 정의하고 하나씩 캡슐화하여 상호 교환 가능하게 만듭니다.
주요 해결 방법: 유사한 알고리즘이 여러 개 있을 때 if...else를 사용하여 발생하는 유지 관리의 복잡성과 어려움.
사용 시기: 시스템에는 수많은 클래스가 있으며 이를 구별하는 것은 직접적인 동작입니다.
해결 방법: 이 알고리즘을 클래스로 하나씩 캡슐화하고 임의로 대체합니다.
키 코드: 동일한 인터페이스를 구현합니다.
적용 예: 1. Zhuge Liang의 팁, 각 팁은 전략입니다. 2. 여행 방법, 자전거를 탈지, 자동차를 탈지 선택하세요. 여행의 모든 방법은 전략입니다. 3. JAVA AWT의 LayoutManager.
장점: 1. 알고리즘을 자유롭게 전환할 수 있습니다. 2. 조건부 판단을 여러 번 사용하지 마십시오. 3. 확장성이 좋다.
단점: 1. 전략 카테고리가 늘어납니다. 2. 모든 전략 클래스는 외부 세계에 노출되어야 합니다.
사용 시나리오: 1. 시스템에 클래스가 많고 클래스 간의 차이점이 동작뿐인 경우 전략 패턴을 사용하면 객체가 여러 동작 중에서 하나의 동작을 동적으로 선택할 수 있습니다. 2. 시스템은 여러 알고리즘 중 하나를 동적으로 선택해야 합니다. 3. 객체에 적절한 패턴 없이 많은 동작이 있는 경우 이러한 동작은 여러 조건 선택 문을 사용하여 구현되어야 합니다.
참고: 시스템에 4개 이상의 전략이 있는 경우 전략 클래스 확장 문제를 해결하려면 혼합 모드 사용을 고려해야 합니다.
Implementation
활동을 정의하는 Strategy 인터페이스와 Strategy 인터페이스를 구현하는 엔터티 전략 클래스를 생성하겠습니다. Context는 특정 전략을 사용하는 클래스입니다.
StrategyPatternDemo, 데모 클래스는 Context 및 전략 개체를 사용하여 전략이 구성되거나 변경에 의해 사용될 때 컨텍스트의 동작 변경을 보여줍니다.
1단계
인터페이스를 만듭니다.
Strategy.java
public interface Strategy { public int doOperation(int num1, int num2); }
2단계
인터페이스를 구현하는 엔터티 클래스를 만듭니다.
OperationAdd.java
public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } }
OperationSubstract.java
public class OperationSubstract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } }
OperationMultiply.java
public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } }
3단계
Context 클래스를 만듭니다.
Context.java
public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int executeStrategy(int num1, int num2){ return strategy.doOperation(num1, num2); } }
4단계
Context를 사용하여 전략 Strategy을 변경할 때 동작이 어떻게 바뀌는지 확인하세요.
StrategyPatternDemo.java
public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationSubstract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }
5단계
출력을 확인합니다.
rreee