제1장: Policy - Based Class Design 독서 노트

Policy Class (Template)
아래 의 이 Creater 들 은 "policy class (template)" 라 고 합 니 다.그것들 은 디자인 모델 의 strategy 와 유사 하 다.태그 가이드 (signature oriented) 가 아 닌 문법 가이드 (syntax oriented) 입 니 다.다시 말 하면 이 Creater 들 은 '어떤 문법 구조 가 규범 에 맞 는 class' 를 정의 하 는 것 이지' 그 함수 들 을 예화 해 야 합 니 다 '가 아 닙 니 다.
template <class T>
struct OpNewCreator
{
static T* Create()
{
return new T;
}
};
template <class T>
struct MallocCreator
{
static T* Create()
{
void* buf = std::malloc(sizeof(T));
if (!buf) return 0;
return new(buf) T;
}
};
template <class T>
struct PrototypeCreator
{
PrototypeCreator(T* pObj = 0): pPrototype_(pObj){}
T* Create()
{
return pPrototype_ ? pPrototype_->Clone() : 0;
}
T* GetPrototype() { return pPrototype_; }
void SetPrototype(T* pObj) { pPrototype_ = pObj; }
private:
T* pPrototype_;
};

Host Classs Template 
policy class (template) 를 사용 하 는 'host class (tempalte)' 라 고 합 니 다.host class (template) 는 조합 이나 계승 방식 으로 policy class (template) 를 사용 합 니 다.host 는 policy 가 제공 하 는 구조 와 행 위 를 더욱 복잡 한 구조 와 행위 로 조합 하 는 것 을 책임 집 니 다.
template <class CreationPolicy>
class WidgetManager : public CreationPolicy {}

host 와 policy 사용 하기:
typedef WidgetManager<OpNewCreator<Widget> > MyWidgetMgr;

emplate template 매개 변수
위의 사용 방법 을 보면 policy (Op NewCreator) 는 템 플 릿 클래스 인자 (Widget) 를 받 아야 합 니 다. 그러나 WidgetManager 로 서 Widget 만 조작 할 수 있 습 니 다. 즉, 한 프로그래머 가 또 다른 클래스 를 policy 에 전달 하면 WidgetManager 와 호 환 되 지 않 아 문제 가 발생 할 수 있 습 니 다.이러한 위험 을 피하 기 위해 'template template 파라미터' 를 사용 할 수 있 습 니 다.
template <template <class Created> class CreationPolicy>
class WidgetManager : public CreationPolicy<Widget>
{...}

template tempalte parameter 에 대해 서 는 이렇게 이해 할 수 있 습 니 다. WidgetManager 라 는 종 류 는 템 플 릿 매개 변 수 를 가 진 클래스 입 니 다. 템 플 릿 매개 변 수 는 template < class Created > class Creation Policy > 이 고 이 템 플 릿 매개 변수 자체 가 템 플 릿 입 니 다.템 플 릿 매개 변수 로 사용 할 이 템 플 릿 은 WidgetManager 에 기본 클래스 를 지정 합 니 다: CreationPolicy < Widget >.WidgetManager 의 템 플 릿 매개 변수 설명 과 사용 한 템 플 릿 을 증명 할 수 있 습 니 다.WidgetManager 의 템 플 릿 매개 변수 인 이 템 플 릿 의 매개 변 수 는 class Created 이 며 CreationPolicy 의 Widget 으로 사 용 됩 니 다.
템 플 릿 을 템 플 릿 매개 변수 로 사용 하면 또 하나의 장점 이 있 습 니 다. 그것 은 바로 현재 WidgetManager 의 템 플 릿 매개 변 수 는 템 플 릿 이기 때문에 이 템 플 릿 으로 다른 템 플 릿 류 를 예화 할 수 있 습 니 다.예 를 들 어 WidgetManager 에서 CreationPolicy < Widegt > (기본 클래스 로) 를 사 용 했 습 니 다. CreationPolicy 를 다른 용도 로 사용 할 수도 있 습 니 다. 예 를 들 어 저 는 WidgetManager 에서 CreationPolicy < Gadget > 을 사용 하여 Gadget 을 만 들 수 있 습 니 다.
실제 사용 중 템 플 릿 매개 변수 에 기본 값 을 줄 수도 있 습 니 다. 예 를 들 어:
template <template <class Created> class CreationPolicy = OpNewCreator>
class WidgetManager : public CreationPolicy<Widget>{...}

좋은 웹페이지 즐겨찾기