[디자인 패턴][행동 패턴] 전략 패턴(Strategy Pattern)
Updated:
1. 개요
알고리즘군을 정의하고 캡술화하여, 알고리즘 간의 상호교환이 가능하도록 하는 패턴
전략 패턴(Strategy Pattern)은 행동 패턴(Behavioral Pattern)의 한 종류로, 행위를 클래스로 캡슐화하여 행위를 자유롭게 바꿀 수 있도록 하는 패턴이다.
2. 행동 패턴(Behavioral Pattern)
2-1. 행동 패턴이란?
행동 패턴이란 처리의 책임을 어떤 객체에게 할당하는 것이 좋은지, 알고리즘을 어떤 객체에 정의하는 것이 좋은지 등의 책임 분배와 관련된 패턴이다.
2-2. 행동 패턴 종류
3. 구성
[출처 : GoF의 디자인 패턴]
-
Strategy : 알고리즘에 대한 공통 연산을 정의한 인터페이스
-
ConcreteStrategy : Strategy 인터페이스 구현체로, 실제 알고리즘 구현
-
Context : 실제 알고리즘을 사용하는 클래스
4. 예제 코드
계산기를 구현한다고 가정해보자. Strategy Pattern을 이용하면 덧셈, 뺄셈 등의 연산을 주입하여 유연하게 사용할 수 있다.
4-1. Strategy
[Calculator.java]
1
2
3
4
public interface Calculator {
int operation(int num1, int num2);
}
4-2. ConcreteStrategy
[Add.java]
1
2
3
4
5
6
7
public class Add implements Calculator {
@Override
public int operation(int num1, int num2) {
return num1 + num2;
}
}
[Sub.java]
1
2
3
4
5
6
7
public class Sub implements Calculator {
@Override
public int operation(int num1, int num2) {
return num1 - num2;
}
}
[Mul.java]
1
2
3
4
5
6
7
public class Mul implements Calculator {
@Override
public int operation(int num1, int num2) {
return num1 * num2;
}
}
4-3. Context
[Context.java]
1
2
3
4
5
6
7
8
9
10
11
12
public class Context {
private Calculator calculator;
public Context(Calculator calculator) {
this.calculator = calculator;
}
public int operation(int num1, int num2) {
return calculator.operation(num1, num2);
}
}
5. 테스트
[Clinet.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Client {
public static void main(String[] args) {
Context context = new Context(new Add());
System.out.println("1 + 2 = " + context.operation(1, 2));
context = new Context(new Sub());
System.out.println("1 - 2 = " + context.operation(1, 2));
context = new Context(new Mul());
System.out.println("1 * 2 = " + context.operation(1, 2));
}
}
[실행 결과]
6. 특징
-
공통 기능의 재사용 : 동일한 행동 군을 정의하므로 재사용 가능
-
조건문 제거 가능 : 캡슐화를 통해 조건문 없이 행동의 선택 가능
-
객체 수 증가 : 각각의 전략들을 클래스로 구현하므로 객체 수의 증가
Leave a comment