私のシナリオでは、Messageクラスを介して通信するコンポーネントAとコンポーネントBがあります。
私のメッセージクラスは次のようになります
class Message {
virtual void prepare();
virtual void parse();
virtual void handle();
};
メッセージは、Messageクラスのサブクラスです。次に例を示します。
class MessageA: public Message {
void prepare() {
...
}
void parse() {
...
}
void handle() {
componentA->executeFunctionABC(); // componentA is a global pointer
}
};
コンポーネントAはMessageAでコンパイルされます
コンポーネントBはMessageAでコンパイルされます
つまり、コンポーネントAがコンポーネントBにメッセージを送信する場合、MessageAオブジェクトをインスタンス化し、prepare()して送信します。コンポーネントBは、ソケットを介してメッセージを受信すると、メッセージをparse()してhandle()します。
私の問題は、handle()関数にあります。メッセージの受信者のみがhandle()関数を呼び出します。handle()関数の実装では、受信コンポーネントの関数を含む特定のルーチンを実行する必要があります。
これで、次のようにPREPROCESSORを使用してこれを解決できます。
void handle() {
#ifdef COMPILE_FOR_COMPONENT_A
componentA->executeFunctionABC();
#endif
}
しかし、それは醜いように見えます。これを正しく行うことができるデザインパターンはありますか?