C++ 静态观察器 class
c++ static observer class
我有两个程序:服务器和客户端
class client
{
private:
Network net;
Gui gui;
};
这是网络 class
class Network
{
public:
void receivePacket(packet)
{
Protocol::readPacket(packet)
}
};
这里是桂class
class Gui
{
private:
std::string informations;
public:
void displayInfo();
void updateInformation(information);
};
这是协议
class Protocol
{
static void readPacket(packet)
{
if (packet.command == "refreshGui")
//I need somehow to call GUI::UpdateInformation here and give the information from packet.information
}
};
协议被视为 "static class",这意味着不应实例化 in。所以这个想法是,当 Protocol::readPacket
从服务器得到一个 packet
时,它应该能够将信息发送到 GUI
。但是,情况并非总是如此,因此传递 point/reference 并不是我想要的。
它没有很好地说明,但想法是:
- Protocol::readPacket
寻求我们是否需要调用 GUI
- 协议不应该接受另一个参数,也不应该被实例化。
有人给了我关于使用观察者模式的建议。 Protocol
是主题,GUI
是观察者。但是,如果没有实例化协议,我无法做到。
那么有没有不实例化协议的方法呢?
在分布式计算中,节点的网络管理器接收消息并调用与消息类型关联的调度程序是一种常见模式。您的需求非常相似。以下是您可以执行的操作:
- 在您的网络 class 中,维护 unordered_map< packet_type、std::function >。
- 当您的程序启动时,将 unordered_map 推入 std::pair<"refreshGui"、Gui::UpdateInformation>
- 在 Network::receivePacket 中,从 unordered_map 中检索函数并调用它。
我有两个程序:服务器和客户端
class client
{
private:
Network net;
Gui gui;
};
这是网络 class
class Network
{
public:
void receivePacket(packet)
{
Protocol::readPacket(packet)
}
};
这里是桂class
class Gui
{
private:
std::string informations;
public:
void displayInfo();
void updateInformation(information);
};
这是协议
class Protocol
{
static void readPacket(packet)
{
if (packet.command == "refreshGui")
//I need somehow to call GUI::UpdateInformation here and give the information from packet.information
}
};
协议被视为 "static class",这意味着不应实例化 in。所以这个想法是,当 Protocol::readPacket
从服务器得到一个 packet
时,它应该能够将信息发送到 GUI
。但是,情况并非总是如此,因此传递 point/reference 并不是我想要的。
它没有很好地说明,但想法是:
- Protocol::readPacket
寻求我们是否需要调用 GUI
- 协议不应该接受另一个参数,也不应该被实例化。
有人给了我关于使用观察者模式的建议。 Protocol
是主题,GUI
是观察者。但是,如果没有实例化协议,我无法做到。
那么有没有不实例化协议的方法呢?
在分布式计算中,节点的网络管理器接收消息并调用与消息类型关联的调度程序是一种常见模式。您的需求非常相似。以下是您可以执行的操作:
- 在您的网络 class 中,维护 unordered_map< packet_type、std::function >。
- 当您的程序启动时,将 unordered_map 推入 std::pair<"refreshGui"、Gui::UpdateInformation>
- 在 Network::receivePacket 中,从 unordered_map 中检索函数并调用它。