디자인 패턴/[ecourse] C++ Design Pattern
3. Template Method & Strategy Pattern
헛둘이
2023. 2. 9. 10:11
변하는 부분을 분리하는 방법
EditBox라는 클래스가 있다.
이 박스에 입력을 받을 때, Name 란에는 문자열만, Phone 란에는 숫자만 입력받게 하고 싶다.
그러려면 EditBox 내부에서 한 글자씩 받아서 그걸 필터하는 함수를 사용해야 하는데,
이 부분을 어떻게 처리하면 좋을까?
1. Template method 패턴
- 가상 함수로 분리하기
- 필터하는 부분을 가상함수로 만들어서 상속받는 클래스에서 재정의한다.
- 전체적인 흐름을 Template method 부분이라고 하며,
- 가상함수로 재정의되는 부분을 Hook Method라고 한다.
- 알고리즘의 전체 구조는 기반 클래스에 정의되며 그 중 특정 단계는 파생 클래스에서 책임진다.
2. Strategy 패턴
- 클래스로 분리하기
- 교체 가능해야한다(약한 결합, 인터페이스 기반)
- IValidator라는 인터페이스를 만들고 EditBox에서는 Set함수로 이 인터페이스를 받는다.
struct IValidator
{
virtual bool validate(string s, char c) = 0;
virtual bool iscomplete(string s) { return true; }
virtual ~IValidator() {}
}
- Strategy 패턴이 갖는 이점은 실행시간에 정책을 바꿀 수 있다는 것
- 그리고 다른 클래스에서 이 정책을 가져다쓸 수 있다 (재사용성)
- 굳이 재사용할 필요 없고, 실행시간에 변경될 일이 없다면 Template Method 패턴을 사용하는 게 좋다.
- 디자인패턴의 큰 프름은 상속보단 컴포지트가 낫다.