2012-06-19 2 views
0

지금 데이터가 필요한 서버 목록에 명령 목록을 보내는 클라이언트가 있습니다. 내 서버는 예를 들어, GetProcAddress를를 사용하여 DLL을 통해 이러한 명령을로드합니다 initiailizeDLL는 다음과 같이 정의된다콜백 디자인 패턴

InitializeDLL initializeDLL = (InitializeDLL)GetProcAddress(hInstanceLibrary, "InitializeDLL"); 

:

클라이언트는 지금은 데이터를 원하는되는 문자열로 명령 이름을 전송
typedef int (CALLBACK* InitializeDLL)(int,int); 

에 대한. 나는 사용할 수 있기를 원하는 명령어 목록을 꽤 가지고 있으며, 효율적인 방법으로 이것을 구현하는 방법에 대한 아이디어가 없다. 나는 Map을 만들고 그 이름을위한 문자열을 키로 사용하고 CALLBACK *을 적절한 함수의 포인터로 사용하려고 생각했다. 그러나 그 후에 나 또한 그것을 캐스팅해야 할 것입니다. 필자는 대부분 Java 프로그래머이고 C++ 프로그래머가 아니기 때문에이 맵 아이디어가 효과가 있는지 또는 결국 캐스트를 처리 할 방법이 있는지 잘 모르겠습니다. 또한 Wikipedia의 Command 패턴을 살펴 보았지만이 경우 어떻게 구현되는지는 알 수 없습니다.

+0

지금 사용되는 <>'나쁜 생각은 아닌 것 같아. 한번 해봐라. 문제가 생기면 다시 돌아와 다른 질문을 할 수있다. STL 컨테이너에 대한 좋은 점은 컨테이너를 'typedef'하는 한 다른 컨테이너를 변경하는 것이 상대적으로 쉽다는 점입니다. – jxh

+0

모든 함수 포인터는 동일한 요소를 갖습니까? – Brady

+0

대부분의 함수 포인터는 유사하지만, 한 쌍이 int 대신 double을 반환하고 매개 변수의 개수가 다를 수 있습니다. –

답변

0

이렇게하려면지도가 잘되어야합니다. 각 문자열을 특정 메시지가 수신 될 때 실행할 함수 포인터에 매핑하는지도입니다. 명령 패턴을 이동하려면 다음과 같이 할 수 있습니다 :

abstract class Command{ 
    private: 
    string commandName; 
    CALLBACK* callBackFunction 
    public: 
    Command(string name, CALLBACK* function){ 
     commandName = name; 
     callBackFunction = function; 
    } 
    // Here, you can check your current environment 
    // to see if you can execute this command in the current 
    // configuration and system state 
    bool CanExecute() = 0; 

    // This method does the call to the callback 
    void Execute(){ 
      // call the callback function here 
    } 
} 

이 패턴은 명령의 혼합입니다 : 시대 이후 Disclamer, 내가 작성하지 않은 C++ 코드를이 코드는) 컴파일하지 않을 수 있습니다 팩토리 메소드 패턴. 가능한 모든 항목에 대해 추상 클래스 Command에서 상속 된 명령을 정의하십시오. 이제 함수 포인터가있는 문자열 맵 대신 명령을 사용하여 문자열 맵을 만들 수 있습니다. 문자열을 얻었 으면 먼저 명령의 CanExecute을 호출하여 명령을 현재 상태에서 실행할 수 있는지 확인합니다. 콜백 함수를 호출하는 명령을 실행하려면 Execute으로 호출하십시오. 이것은 캡슐화 명령, 실행 사전 조건 및 실행할 실제 코드를 생각할 수있는 가장 좋은 방법입니다. 보조 노트에

는,이 패턴은 널리 .NET (WPF)는 '지도를 사용