我需要重构处理请求的类。我不需要责任链,因为在编译时我已经指定哪个请求连接到哪个处理程序。
我的想法是创建一个负责所有逻辑的单例类。 例如,它将具有指向数据库对象的指针,它将处理请求。
HandlerMessage将有一个接口,许多类都是从它们派生的。
假设我们有:
class Singleton {
Database db;
int handleMessage(const Request& in, Response& out);
};
int Singleton::handleMessage(const Request& in, Response& out) {
int result = 0;
HandlerMessage* handler;
if(in.type == RequestType::A)
handler = new HandlerA();
else if(in.type == RequestType::B)
handler = new HandlerB();
else
return -1;
result = handler->handle(in, out);
delete handler;
return result;
}
然而,HandlerMessage需要使用数据库,我想知道如何使用它们。 我可以将指针作为HandlerMessage类中句柄函数的参数传递给数据库。 然而,在我看来这很奇怪,因为我有时会传递相同的论点。此外,并非所有处理程序都需要使用数据库。
我的问题是:
class MessageHandler {
static Database* db;
}
这是一个很好的解决方案,我在Singleton构造函数中使用来自SingeltonClass的db从MessageHandler类初始化db?
或者最好使用更复杂的解决方案?
感谢您的回复!
答案 0 :(得分:1)
您可以在处理程序的构造函数中将引用传递给数据库,如下所示:
handler = new HandlerA(db); //HandlerA needs to deal with database
handler = new HanlderB(); //HandlerB doesn't need to deal with database
HandlerA
可能如下所示:
class HandlerA : public MessageHandler
{
HandlerA(Database& db) { /* ... */ }
int handle(const Request& in, Response& out) { /* ... */ }
};