디자인 패턴/[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 패턴을 사용하는 게 좋다.

 

 

 

- 디자인패턴의 큰 프름은 상속보단 컴포지트가 낫다.