Skip to content

Instantly share code, notes, and snippets.

@lsem
Last active January 14, 2016 10:40
Show Gist options
  • Save lsem/82f35c809e54811c7e79 to your computer and use it in GitHub Desktop.
Save lsem/82f35c809e54811c7e79 to your computer and use it in GitHub Desktop.
Server Handler -- Prototype Pattern
class ICommandHandler {
public:
virtual void handle(const string &request) = 0;
virtual ICommandHandler* cone() = 0;
};
class CommandTypeAHandler : public ICommandHandler {
void handle(const string &request) override {
// ...
}
virtual ICommandHandler* cone() override {
return new CommandTypeAHandler();
}
};
// Same for CommandTypeAHandler ..
// Same for CommandTypeBHandler ..
// Same for CommandTypeCHandler ..
// Same for CommandTypeDHandler ..
class Server {
public:
void registerCommandHandlers() {
registerHandler('CommandTypeA', new CommandTypeAHandler());
registerHandler('CommandTypeB', new CommandTypeBHandler());
registerHandler('CommandTypeC', new CommandTypeCHandler());
registerHandler('CommandTypeD', new CommandTypeDHandler());
}
void registerHandler(const string &commandId, ICommandHandler *handler) {
_handlersPrototypes[commandId] = handler;
}
void processRequest(const string &request) {
auto handler = getHandlerForCommandID(parseRequestIDFromRequesteString(request));
handler->handle(request);
}
shared_ptr<ICommandHandler> getHandlerForCommandID(const string &commandId) {
auto *handler = _handlersPrototypes[commandId]->clone();
return handler;
}
private:
map<string, ICommandHandler *> _handlersPrototypes;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment