스트래티지 패턴(Strategy Pattern)
디자인패턴 2014. 11. 11. 14:251. 스트래티지 패턴이란?
알고리즘군을 정의하고 각각을 캡슐화(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
'디자인패턴' 카테고리의 다른 글
템플릿 메소드 패턴(Template Method Pattern) (0) | 2014.11.11 |
---|---|
퍼사드 패턴(Facade Pattern) (0) | 2014.11.11 |
커맨드 패턴(Command Pattern) (0) | 2014.11.11 |
싱글턴 패턴(Singleton Pattern) (0) | 2014.11.11 |
팩토리 패턴(Factory Pattern) (0) | 2014.11.11 |