Strategy 패턴
- Strategy 패턴이란 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴이다.
- 같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고 이들이 필요할떄 교체할 수 있게 함으로써 동일
한 문제를 다른 알고리즘으로 해결할 수 있게 하는 디자인 패턴이다.

- Strategy : 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시
- ConcreteStrategy1,2,3 : Strategy 패턴에서 명시한 알고리즘을 실제로 구현한 클래스
- Context : Strategy 패턴을 이용하는 역할을 수행, 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 setter 메서
드를 제공
Strategy 패턴 예시

- 위의 클래스 설계는 작업시간과 초과시간을 기반으로 임금계산을 해주는 기능을 제공한다.
- 해당 클래스는 한 클래스에서 임금계산 기능만을 수행하므로 SRP는 만족한다.
- 하지만 임금 계산 로직이 바뀌거나 새로운 로직이 추가될 경우 코드가 변경되고, 다른 로직에 영향을 미칠 수 있다는
문제점 때문에 OCP는 만족하지 못한다.
- 위와 같은 경우 로직의 변경, 새로운 로직의 추가에도 기존의 코드들이 아무런 영향을 받지 않도록 하기 위해 Strategy
패턴을 적용한 설계가 필요한 것이다.
- 이 때 변화하는 변화의 단위는 임금을 계산하는 로직이므로 로직을 클래스로 만들어 주어야 한다.

- 위의 클래스 설계는 Strategy 패턴을 적용하여 로직의 변경, 새로운 로직의 추가에도 기존의 코드들은 영향을 받지 않
도록 설계한 것이다.
- Employee 클래스가 Context 역할을 수행하고 Pay Manager 인터페이스는 구체적 클래스로 구현된 임금 계산 로직들
을 캡슐화 해준다.
- Pay Manager 인터페이스가 로직 변화에 대한 방화벽 역할을 수행 해주어 로직의 변경, 새로운 로직 추가 등의 변화에
도 Employee 클래스의 변경을 차단해준다.
Employee 클래스
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
public class Employee {
private String id;
private String name;
private int workHours;
private int overTimeHours;
private PayManager payManager;
public void setPayManager(PayManager payManager) {
this.payManager = payManager;
}
public int pay() {
return payManager.pay(workHours, overTimeHours);
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public int getWorkHours() {
return workHours;
}
public int getOverTimeHours() {
return overTimeHours;
}
// id, name은 생성자에서 참조
public Employee(String id, String name) {
this.id = id;
this.name = name;
}
public void setWorkHours(int workHours) {
this.workHours = workHours;
}
public void setOverTimeHours(int overTimeHours) {
this.overTimeHours = overTimeHours;
}
}
|
cs |
PayManager 인터페이스
|
1
2
3
4
5
|
public interface PayManager {
public int pay(int workHours, int overTimeHours);
}
|
cs |
ClassicalPayment 클래스
|
1
2
3
4
5
6
7
8
9
|
public class ClassicalPayment implements PayManager {
// 작업시간, 초과시간을 인자로 받아 임금을 계산해주는 로직 클래스
@Override
public int pay(int workHours, int overTimeHours) {
return 10000*workHours+15000*overTimeHours;
}
}
|
cs |
NewPayment 클래스
|
1
2
3
4
5
6
7
8
9
10
11
|
public class NewPayment implements PayManager {
@Override
public int pay(int workHours, int overTimeHours) {
if (overTimeHours>10)
return 20000*workHours+30000*overTimeHours;
else
return 10000*workHours+20000*overTimeHours;
}
}
|
cs |
Main
|
1
2
3
4
5
6
7
8
9
10
11
|
public class Main {
public static void main(String[] args) {
Employee emp1 = new Employee("1234", "insang1");
emp1.setWorkHours(40);
emp1.setOverTimeHours(10);
//emp1.setPayManager(new ClassicalPayment());
emp1.setPayManager(new NewPayment());
System.out.println(emp1.pay());
}
}
|
cs |
'설계 패턴' 카테고리의 다른 글
| 템플릿 메서드 패턴 (0) | 2020.11.12 |
|---|---|
| Decorator 패턴 (0) | 2020.11.09 |
| 빌더 패턴 (Builder Pattern) (0) | 2020.10.06 |
| SOLID 원칙 (0) | 2020.10.05 |
| 클래스 다이어그램 (0) | 2020.09.17 |
