Design Pattern

전략 패턴(Strategy Pattern)

snowkit 2022. 5. 27. 05:06

정의

  • 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있다
  • 전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다

원칙

  1. 변경될 수 있는 부분은 따로 뽑아서 캡슐화한다
    • 나중에 바뀌지 않는 부분에는 영향을 미치지 않고 그 부분만 고치거나 확장할 수 있다
  2. 구현보다 인터페이스에 맞춰서 개발한다
    • 바뀌는 부분은 코드를 수정하지 않아도 구현체만 바꿔주면 해결할 수 있다
  3. 중복될 수 있는 인터페이스 메소드는 서브클래스에서 구현하지 않는다
  4. 상속보다 Composition을 활용한다

중복될 수 있는 인터페이스 메소드를 서브클래스에서 구현하는 경우 단점

  • 중복될 수 있는 메소드를 일일히 구현하면 코드를 재사용하지 않으므로, 변경될 때마다 전부 찾아서 바꿔줘야 하기 때문에 관리에 큰 문제가 생긴다

상속의 단점

  • 상속을 사용하면 기능을 다르게 사용해야 하는 서브클래스에서 메소드를 오버라이드해서 사용해야 한다
    • 오버라이드하는 경우 중복될 수 있는 코드를 재사용하기 어렵다
    • 요구사항이 바뀔 때마다 서브클래스 메소드를 일일히 살펴보고 상황에 따라 새롭게 오버라이드해야 한다

Composition(구성|조합|합성)

  • 클래스가 다른 클래스의 객체를 멤버로 포함하는 것을 의미한다
    • 캡슐화된 인터페이스들을 하나로 모아서 사용할 수 있다
  • 슈퍼클래스에서는 캡슐화된 인터페이스의 메소드만 호출하고, 서브클래스에서는 캡슐화된 인터페이스 구현체만 연결하면 된다
    • 중복될 수 있는 인터페이스 메소드는 미리 구현해놓고 서브클래스에서 연결만 해주면 되므로 일일히 구현할 필요 없이 코드를 재사용할 수 있다
    • 요구사항이 바뀔 때마다 캡슐화된 구현체만 변경하면 되므로 코드 관리가 훨씬 편리하다
  • 번역이 제각각인데 구성, 조합, 합성, 컴포지션 등으로 지칭한다

정리

추상 클래스의 몇몇 구상 클래스에서 똑같이 구현해야 하는(중복 사용) 메소드

  • 따로 뽑아서 캡슐화한다
  • 캡슐화된 인터페이스를 추상 클래스에 선언한다
  • 각각의 구상 클래스에서 생성자나 Setter 등을 통해 캡슐화된 인터페이스를 캡슐화된 구현체로 초기화한다

추상 클래스의 모든 구상 클래스에서 똑같이 구현해야 하는(중복 사용) 메소드

  • 추상 클래스에서 메소드 구현 후 상속한다

추상 클래스의 구상 클래스에서 각각 다르게 구현해야 하는 메소드

  • 추상 메소드로 선언 후 구상 클래스에서 구현한다

예제 코드

'Design Pattern' 카테고리의 다른 글

옵저버 패턴(Observer Pattern)  (0) 2022.05.28