자바/자바 자료실

[디자인패턴] 01. 스트래티지 패턴 (Strategy Pattern)

Chipmunks 2018. 10. 19.
728x90


스트래티지 패턴 (Strategy Pattern)

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


객체지향 원칙

  • 바뀌는 부분은 캡슐화한다.
  • 상속(Inheritance)보다는 구성(Composition)을 활용한다.
  • 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다.

다이어그램



예제 코드

Behaviors 패키지

- Behaviors/QuackBehavior.java


1
2
3
4
5
package Behaviors;
 
public interface QuackBehavior {
    public void quack();
}
cs


- Behaviors/Quack.java


1
2
3
4
5
6
7
8
package Behaviors;
 
public class Quack implements QuackBehavior {
    public void quack() {
        System.out.println("꽥");
    }
}
 
cs


- Behaviors/Squeak.java


1
2
3
4
5
6
7
8
package Behaviors;
 
public class Squeak implements QuackBehavior {
    public void quack() {
        System.out.println("삑");
    }
}
 
cs


- Behaviors/MuteQuack.java


1
2
3
4
5
6
7
8
package Behaviors;
 
public class MuteQuack implements QuackBehavior {
    public void quack() {
        System.out.println("<< 조용~ >>");
    }
}
 
cs


- Behaviors/FlyBehavior.java


1
2
3
4
5
6
package Behaviors;
 
public interface FlyBehavior {
    public void fly();
}
 
cs


- Behaviors/FlyWithWings.java


1
2
3
4
5
6
7
8
package Behaviors;
 
public class FlyWithWings implements FlyBehavior {
    public void fly() {
        System.out.println("날고 있어요!!");
    }
}
 
cs


- Behaviors/FlyNoWay.java


1
2
3
4
5
6
7
8
package Behaviors;
 
public class FlyNoWay implements FlyBehavior {
    public void fly() {
        System.out.println("저는 못 날아요");
    }
}
 
cs


- Behaviors/FlyRocketPowered.java


1
2
3
4
5
6
7
8
9
10
package Behaviors;
 
public class FlyRocketPowered implements FlyBehavior {
 
    public void fly() {
        System.out.println("로켓 추진으로 날아갑니다");
    }
 
}
 
cs


Ducks 패키지

- Ducks/Duck.java


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
package Ducks;
 
import Behaviors.FlyBehavior;
import Behaviors.QuackBehavior;
 
public abstract class Duck {
    
    FlyBehavior flyBehavior;
    QuackBehavior quackBehavior;
    
    public Duck() {    /* empty */ }
    
    public abstract void display();
    
    public void performFly() {
        flyBehavior.fly();
    }
    
    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;
    }
    
}
 
cs


- Ducks/MallardDuck.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Ducks;
 
import Behaviors.FlyWithWings;
import Behaviors.Quack;
 
public class MallardDuck extends Duck {
    
    public MallardDuck() {
        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();
    }
    
    public void display() {
        System.out.println("저는 물오리입니다");
    }
 
}
 
cs

- Ducks/ModelDuck.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Ducks;
 
import Behaviors.FlyNoWaay;
import Behaviors.Quack;
 
public class ModelDuck extends Duck {
    
    public ModelDuck() {
        flyBehavior = new FlyNoWaay();
        quackBehavior = new Quack();
    }
    
    public void display() {
        System.out.println("저는 모형 오리입니다");
    }
 
}
 
cs


테스트 코드

MiniDuckSimulation.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package practice_strategy_pattern;
 
import Behaviors.*;
import Ducks.*;
 
public class MiniDuckSimulator {
 
    public static void main(String[] args) {
        Duck mallard = new MallardDuck();
        mallard.performQuack();
        mallard.performFly();
        
        Duck model = new ModelDuck();
        model.performFly();
        model.setFlyBehavior(new FlyRocketPowered());
        model.performFly();
    }
 
}
 
cs


댓글