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 |
'자바 > 자바 자료실' 카테고리의 다른 글
[디자인 패턴] 06. 커맨드 패턴 (Command Pattern) (0) | 2018.10.23 |
---|---|
[디자인 패턴] 05. 싱글턴 패턴 (Singleton Pattern) (0) | 2018.10.23 |
[디자인 패턴] 04. 팩토리 패턴 (Factory Pattern) (0) | 2018.10.23 |
[디자인패턴] 03. 데코레이터 패턴 (Decorator Pattern) (0) | 2018.10.22 |
[디자인패턴] 02. 옵저버 패턴 (Observer Pattern) (0) | 2018.10.19 |
댓글