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
TAGS.

Comments