Design Pattern

[design pattern] strategy

kelicia 2020. 8. 24. 00:18

 Strategy pattern 

- 알고리즘 군을 정의하고 각각의 구현체를 캡슐화하여 이들을 교환해서 사용할 수 있도록 만든다.

- 이를 활용해 알고리즘을 사용하는 Client 와는 독립적으로 알고리즘을 변경할 수 있다.

 

 

head first design pattern 중 strategy pattern 예제

그림 예제에서 코드로 부가설명을 하자면,

class ModelDuck: Duck {
    public ModelDuck() {
        flyBehavior = new FlyNoWay();
        quackBehavior = new Quack();
    }
}

class Simulator {
    public static void main(String[] args) {
    	Duck d = new ModelDuck();
        d.performFly(); // fly-no-way.fly()
        d.setFlyBehavior(new FlyWithWings());
        d.performFly(); // fly-with-wings.fly()
    }
}

 

핵심은 동적으로 행위를 정한다는 점이다.

동일한 목적의 행위를 서로 다른 알고리즘들 가운데 상황에 따라 선택함으로서

기존 코드의 유지, 보수는 물론 유연한 확장성을 가질 수 있다.

 

위 Duck 예제가 잘 와닿지 않는다면 Sort, Search 알고리즘도 좋은 예제가 될 것 같다.

호출하는 입장에선 다 같은 sort() 지만 실제 호출되는 구현체는 bubble이 될 수도, quick이 될 수도 있다.

 

위 예제에선 behavior instance를 생성해서 주입했는데,

실제 적용할 때는 객체 생성을 남발하지 않도록 주의해야 하겠다.

 


설계도 보다보면 strategy pattern 이랑 헷갈리는 command pattern 도 있는데... (나만 그런가)

다시 공부하면서 내가 느낀 가장 큰 차이점은 각 패턴이 인지하는 문제 상황인 것 같다.

 

strategy: 결과적으로 수행하는 일은 같지만, 필요에 따라 다른 방법으로 수행할거야!

command: 새로운 요청이 생겼을 때 이를 처리하는 작업을 쉽게 추가할 수 있도록 일반화하고 싶어!

 

이런 느낌적 느낌의 차이?

이렇게 정리하니까 전혀 다른 패턴으로 보이는데, 뭐가 그렇게 헷갈렸던 걸까 하는 급 자괴감이 든다..

 


reference.

- Head First: Design Pattern

- GoF 디자인 패턴! 이렇게 활용한다