김풀빵님의 뼈의 최후통첩..
내 일상 2008. 5. 20. 01:05 |참.. 이 영화로 이렇게 까지 싱크를 맞춰서 제작했다니.. 놀랍네요.. ^^
중재자 ( Mediator )
의도
동기
MFC의 개발을 하다 보면 화면 UI 및 데이터간의 연동이 필요 하게 됩니다.
리스트 박스의 셀렉트가 되면 해당 에디터 박스에 출력을 하고, 그 반대의 경우도 존재 할 수 있습니다.
이러한 경우 객체 대 객체 간의 데이터 접근 방법을 사용하게 되면 결합도가 높아지면서 코드가 복잡해 지고,
재 사용성을 떨어 트리게 됩니다.
이때, 중재자 객체를 활용하면 여러 객체가 처리 하는 행동들을 하나의 객체에서 처리 하게 되면서 이런 문제점들을 해결할 수 있습니다.
중재자 객체는 객체 그룹 간의 상호작용을 제어하고 조화를 이루는 역활을 합니다.
즉, 객체 사이의 연결 정도가 줄어 들게 됩니다.
하나의 예를 들어 보겠습니다.
리스트 박스와 에디터 박스가 있다고 합시다.
UML 내용을 한번 볼께요.
template< class T1, class T2 >
class Test
{
};
이런 클래스가 있다고 합시다.
우리는 이 클래스가 두개의 템플릿 인자를 받아 들인다는 걸 알고 있습니다.
Test< Ca, Cb > A;
A a;
이런 식이 되는 거죠.
그렇다면 저희가 작업 할때 Test 라는 템플릿 클래스를 놓고 특정 타입에 대해서
특화 되게 구현하고 싶은 경우가 있을거예요.
template< class T1, class T2 >
class Test {};
template <>
class Test< CT, CU > {};
이렇게 두개의 같은 클래스이지만 하나는 CT, CU의 명시적으로 특화된 클래스가 또 하나 존재를 하게 되면 만약 코딩을 통해서 CT, CU가 들어 오게 되면 아래의 클래스가 동작 되게 되는거죠.
바로 이게 부분 특화 입니다.
이때 부분적으로 특화를 하고 싶다면 아래와 같은 클래스를 하나 추가 하면 되요
template < class T1 >
class Test< T1, CU > {};
앞의 T1은 모든 객체를 다 받아 들이고 뒤의 CU는 명시적으로 선언을 해놨어요.
이게 바로 부분 특화라는 거죠 ^^
하나더 해볼까요?.
Button 이라는 클래스가 있다고 합시다. 모든 Button과 CU에 대해서 특화 시키고자 한다면...
template < class T1 >
class Test< Button<T1>, CU > {};
이렇게 하면 되죠 ^^
템플릿의 장점은 참 많네요..
ps. 지적 및 조언 및 질문 해주시면 고맙겠습니다.
제목이 참 아리송 합니다. ^^
하지만 내용을 읽고 나면 이해가 될거예요..
이전의 포스트 를 우선 보시고 이 내용을 꼭 보셔야 합니다.
우선 이전의 내용을 한번 짚어 보면...
단위 전략을 통해서 객체 생성에 new, malloc를 선택적으로 해줄 수 있다는 거죠.
typedef WidgetManager< OpNewCreator<CTest> > MyWidgetMgr;
MyWidgetMgr a;
이런 코드를 사용해서 CTest를 특화 되게 구현할 수 있게 되는거죠.
즉, CTest 의 객체를 new, malloc를 선택해서 처리가 가능하다는 말이 됩니다.
그런데 이때 고민이 좀 됩니다.
뭐냐 하면 내부에서
CTest* p = CreationPolicy().Create( p2 );
이 코드를 사용했어요. CTest 를 특화 했기 때문에 CTest만을 사용하게 되는거예요.
난 다른 객체들도 메니져 안에서 다 관리 해주고 할려고 하면 에러가 나서 안되는거죠.
그래서 이 포스트의 주제가 나옵니다.
기본 선언은 비슷하게 구현하되 내부에서 다른 객체를 생성하는 것도 가능하게 말이죠.
우선 아래의 코드를 한번 보고 해요.
template < class T >
struct OpNewCreator
... 생략
template < class T >
struct MallocCreator
... 생략
template < template < class > class CP >
class CTestMgr : public CP<CTest>
{
public:
CTestMgr()
{
CTest2* ptest2 = CP<CTest2>().Create();
}
~CTestMgr() {}
};
위의 코드를 보면 이런 코드가 보입니다.
template < template < class > class CP >
이게 바로 템플릿 템플릿 인자를 통한 단위전략의 중요한 부분이라고 보여 집니다.
즉 이렇게 해서 CP<CTest> 라고 명시적으로 적어 주게 되면 아래와 같은 코드를 통해서 메니져를
처리할 수 있습니다.
typedef CTestMgr< OpNewCreator > MyTestMgr;
원래는 OpNewCreator 에 다른 인자를 더 넣어 주어야 하지만 명시적으로 처리가 되었기 때문에
추가를 해줄 필요가 없게 됩니다.
이렇게 하고 나면...
바로 아래와 같이 내부에서 다른 객체를 사용할 수 있게 됩니다.
CTest2* ptest2 = CP<CTest2>().Create();
어때요?.. CP의 단위 전략을 사용하면서 내가 원하는 다른 객체를 적용할 수 가 있게 됩니다.
Tip.
여기서 보시면 CP에 CTestMgr를 연결할 수도 있게 되요.
CTestMgr* p = CP<CTestMgr>().Create(); 이렇게요.
이건 나중에 템플릿을 여러개로 사용하면서 현재 클래스를 체크를 해준다거나 하는
여러가지 기능을 처리 하는 부분에서 또 설명이 나오네요..
오늘 내용은 여기 까지 ^^
ps. 지적 및 조언 및 질문 해주시면 고맙겠습니다.