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. 특징

  • 공통 기능의 재사용 : 동일한 행동 군을 정의하므로 재사용 가능

  • 조건문 제거 가능 : 캡슐화를 통해 조건문 없이 행동의 선택 가능

  • 객체 수 증가 : 각각의 전략들을 클래스로 구현하므로 객체 수의 증가

Updated:

Leave a comment