스트래티지 패턴(Strategy Pattern)

디자인패턴 2014. 11. 11. 14:25

1. 스트래티지 패턴이란?


 알고리즘군을 정의하고 각각을 캡슐화(Encapsulte)하여 교환해서 사용할 수 있도록 만든다. 스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.



2. 스트래티지 패턴 예시

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
// 나는 행동에 대한 클래스에서 이 인터페이스를 구현(implement)하게 된다.
// 이것을 알고리즘군이라고 할 수 있다.
public interface FlyBehavior {
    public void fly();
}
 
 
public class FlyNoWay implements FlyBehavior {
 
    @Override
    public void fly() {
        System.out.println("저는 못 날아요.");
    }
 
}
 
 
public class FlyRocketPowered implements FlyBehavior {
 
    @Override
    public void fly() {
        System.out.println("로켓추진으로 날아갑니다.");
    }
 
}
 
 
public class FlyWithWings implements FlyBehavior {
 
    @Override
    public void fly() {
        System.out.println("날고 있어요!");
    }
 
}
 
 
public interface QuackBehavior {
    public void quack();
}
 
 
public class Quack implements QuackBehavior {
 
    @Override
    public void quack() {
        System.out.println("꽥");
    }
 
}
 
 
public class Squeak implements QuackBehavior {
 
    @Override
    public void quack() {
        System.out.println("삑");
    }
 
}
 
 
public class MuteQuack implements QuackBehavior {
 
    @Override
    public void quack() {
        System.out.println("<<조용~>>");
    }
 
}
 
 
public abstract class Duck {
     
    // 행동 인터페이스 형식의 레퍼런스 변수 두 개를 선언한다.
    // 모든 subclass에서 이 변수를 상속받는다.
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
     
    public Duck(){
         
    }
     
    public abstract void display();
     
    // 행동 클래스에 위임(Delegate)한다.
    public void performFly(){
        flyBehavior.fly();
    }
     
    // 행동 클래스에 위임(Delegate)한다.
    public void performQuack(){
        quackBehavior.quack();
    }
     
    public void swim(){
        System.out.println("모든 오리는 물에 뜹니다. 가짜 오리도 뜨죠");
    }
     
    // 오리의 행동을 동적으로 지정하는 방법
    public void setFlyBehavior(FlyBehavior fb){
        flyBehavior=fb;
    }
     
    public void setQuackBehavior(QuackBehavior qb){
        quackBehavior=qb;
    }
}
 
 
public class MallardDuck extends Duck {
 
     
    public MallardDuck() {
        // 꽥꽥거리는 소리를 처리할 때는 Quack 클래스를 사용하기 때문에
        // performQuack()이 호출되면 꽥꽥거리는 행동은 Quack 객체에게 위임된다.
        quackBehavior=new Quack();
         
        // FlyBehavior 형식으로는 FlyWithWings를 사용한다.
        flyBehavior=new FlyWithWings();
    }
    @Override
    public void display() {
        System.out.println("저는 물오리입니다.");
    }
 
}
 
 
public class ModelDuck extends Duck {
 
    public ModelDuck() {
        flyBehavior=new FlyNoWay();
        quackBehavior=new Quack();
    }
     
    @Override
    public void display() {
        System.out.println("저는 모형오리입니다.");
    }
 
}
 
 
public class MiniDuckSimulator {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        Duck mallard=new MallardDuck();
        // MallardDuck에서 상속받은 performQuack() 메소드가 호출된다.
        // 이 메소드에서 QuackBehavior에게 할 일을 위임(Delegate)한다.
        mallard.performQuack();
        mallard.performFly();
         
        Duck model=new ModelDuck();
        model.performFly();
        model.setFlyBehavior(new FlyRocketPowered());
        model.performFly();
    }
 
}









참고
Head FIrst Design Pattern : 스토리가 있는 패턴 학습법
http://www.gurubee.net/pages/viewpage.action?pageId=1507401




출처 - http://digitanomad.blogspot.kr/2013/03/strategy-pattern.html

: