ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Strategy Pattern
    학교생활/소프트웨어디자인패턴 2023. 10. 15. 16:01
    728x90

    Strategy pattern 은 무엇이고 왜 이렇게 하는 것이 중요한가? 

    (예시 - 가격정책)
    전략패턴은 ‘확실히 정해진 것이 없기 때문에’ 사용한다. 무엇을 한다는 것은 정해져 있지만, 어떻게 하고자 하는 것에 대해 런타임 도중 동적으로 알고리즘을 선택 할 수 있다. 직접 행위(코드)를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법이다.
    간단히 말해서 객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴이다.

    그래서 새로운 로직을 추가하거나 변경할 때, 한번에 효율적으로 변경이 가능하다. 코드를 일일이 고치지 않아도 된다. 따라서 시스템이 확장되어도 유지보수가 용이하다.

     

    Strategy Pattern 에서 지켜 지는 세 가지 원칙

    1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분과 분리한다. 그리고 바뀌는 부분은 캡슐화한다. 이로서 코드의 재사용이 가능해지고 SOLID 의 OCP 원칙도 지켜진다. 

    2. 구현보다는 인터페이스에 맞춰서 프로그래밍한다. 바뀌지 않는 Duck 클래스에서 행동을 구체적으로 구현하지 않고, 행동 인터페이스의 행동 클래스에서 구현한다. 인터페이스를 사용하면 여러 클래스가 동일한 인터페이스를 구현할 수 있으므로, 다형성을 활용하여 객체를 동적으로 교체하거나 확장할 수 있습니다. 이것은 새로운 기능을 추가하거나 기존 기능을 수정할 때 코드 수정의 범위를 줄여줍니다. 다른 형식의 객체에서도 나는 행동과 꽥꽥 거리는 행동을 재사용할 수 있다.(해당 행동이 더이상 Duck 클래스 안에 숨겨져 있지 않으므로) 그리고 기존의 행동 클래스를 수정하거나 날아다니는 행동을 사용하는 Duck 를 전혀 건드리지 않고도 새로운 행동을 추가할 수 있다. 재사용의 장점!
    3. 상속보다는 구성을 활용.  Duck 클래스 내의 fly()와 quack() 을 상속하도록 두지 않고, flybehavior 와 quackbehavior 를 가지고, 그 아래 mallardDuck 에게 행동을 위임한다. 유연성을 크게 향상 시킬 수 있다. setter 를 사용하여 실행 시에 다이나믹하게 행동을 바꿀 수도 있다.

     

    여기서,

    Composition 과 상속은 각각 무엇인가? 어떻게 다른가?

    상속은 기능의 재사용을 위해 사용하는 대표적인 디자인 패턴이다. 자식 클래스는 부모클래스에게 상속받아 변수와 메서드를 재사용할 수 있다.  하지만 부모 클래스의 변경사항이 자식클래스에게 영향을 미친다. 즉, 둘 사이의 결합도가 강하다. 이것은 상속의 문제점 중 하나이고 이는 구성을 사용함으로써 해결할 수 있다.

    구성은 한 클래스가 다른 클래스를 인스턴스 변수로 가지고 있는 형태이다. 그렇게 되면 A 클래스와 B클래스는 loose couple 한 관계를 가지게 된다. 

     

    delegation 과는 어떤 관계가 있는가? 어떻게 하는가? 그래서 품질이 어떻게 좋아졌나?

    어떤 기능을 자신이 처리하지 않고 다른 객체에 위임시켜 그 객체가 일을 처리하도록 하는 것이다.
    interface를 사용하면서 외부에서 객체를 주입하면 더 느슨하게 결합한다. 이렇게 하면 변하는 상황에 따른 유연성이 올라간다.
    MullDuck 은 performQuack() 를 할때 어떻게 소리를 내는지 신경을 쓸 필요가 없다. 꽥꽥 거리는 행동은 Quack 객체에게 위임된다. 
    구성을 사용하면서도 delegation 을 하면 결합도를 더 낮출 수 있다. 느슨한 결합은 유지보수성과 재사용성을 높이고 시스템의 확장을 용이하게 만든다. 

     

     

    728x90
Designed by Tistory.