알고리즘 군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지 패턴을 이용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리 즘을 변경 할 수 있다.
애플리케이션에서 바뀌는 부분을 따로 찾아내어 캡슐화 시킨다. 그렇게 하면 나중에 바뀌지 않는 부분에는 영향을 미치지 않은 채로 그 부분만 고치거나 확장할 수 있다.
상속으로 인한 문제
다음은 일반적인 상속을 이용한 ‘오리’에 대한 모델을 설계한 것이다.
상속은 객체지향언어의 특징중 중요한 한가지이지만 상속으로 인한 몇가지 문제가 발생할 수 있다.
ü 실행시 특징을 바꾸기 힘들다.
ü 코드를 변경했을때 하위 클래스들에게 원치 않는 영향을 줄 수있다.
위와 같은 문제의 근본 원인은 “변화”에 있다. 그럼 클래스 모듈을 어떻게 변화에 유연하게 대처 할 수 있을까?
Ø 구현이 아닌 Interface에 맞추어 프로그래밍 한다. 즉 “상위형식에 맞춰서 프로그래밍 한다.
즉 실행시에 쓰이는 객체가 코드에 의해서 고정되지 않도록 어떤 상위형식(Super Type)에 맞춰서 프로그래밍 함으로써 다형성을 활용해야 한다는 것이다.
그리고 더 바람직한 방법은 상위 형식의 인스턴스를 만드는 과정을(new Dog() 같은 형식으로)직접 코드로 만드는 대신 구체적으로 구현된 객체를 실행시에 대입하는 것이다.
Ø 변경될 수 있는 부분을 따로 분리하여 갭슐화된 형태로 개발하고 Client쪽(Duck)에서는 이렇게 따로 캡슐화된 코드에게 기능을 위임하는 형태로 프로그래밍 한다.
이와 같은 원칙으로 Duck에대한 행동을 따로 분리하여 인터페이스형식에 맞춰서 위임될 코드를 모델링 하면 다음과 같다.
이젠 위의 모델을 Client(Duck)에서 위임하여 다음과 같이 처리하게 하면 된다.
다음코드는 위와 같이 모델링된 코드를 이용한 테스트 코드이다.
package headfirst.strategy;
public class MiniDuckSimulator1 {
public static void main(String[] args) {
// MallardDuck는 Duck으로 부터 확장되었으며 Duck에는 행동(날다, 소리내다)을 // 위임 받을수 있는 (추상) 객체변를 가지고있다. Duck mallard = new MallardDuck(); mallard.performQuack(); mallard.performFly();
Duck model = new ModelDuck(); model.performFly(); // 실행중에 새로 위임받은 행동을 지정하여 행동을 변경할 수 있다. model.setFlyBehavior(new FlyRocketPowered()); model.performFly();
} }
|
package headfirst.strategy; public class MallardDuck extends Duck { public MallardDuck() { quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } /* * (non-Javadoc) * * @see headfirst.strategy.Duck#display() */ public void display() { System.out.println("I'm a real Mallard duck"); } }
package headfirst.strategy;
public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior;
public Duck() { }
public void setFlyBehavior(FlyBehavior fb) { flyBehavior = fb; }
public void setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; }
abstract void display();
public void performFly() { flyBehavior.fly(); }
public void performQuack() { quackBehavior.quack(); }
public void swim() { System.out.println("All ducks float, even decoys!"); } }
|
DecoyDuck.javaDuck.javaFakeQuack.javaFlyBehavior.javaFlyNoWay.javaFlyRocketPowered.javaFlyWithWings.javaMallardDuck.javaMiniDuckSimulator.javaMiniDuckSimulator1.javaModelDuck.javaMuteQuack.javaQuack.javaQuackBehavior.javaRedHeadDuck.javaRubberDuck.javaSqueak.javaStretagePattern.ucls
'Java Design Pattern' 카테고리의 다른 글
Decorator 패턴 (0) | 2013.02.20 |
---|---|
Observer 패턴 (0) | 2013.02.20 |
Facade 패턴 (0) | 2013.02.19 |
Adapter 패턴 (0) | 2013.02.19 |
Command 패턴 (0) | 2013.02.19 |