Last active
January 14, 2016 10:40
-
-
Save lsem/82f35c809e54811c7e79 to your computer and use it in GitHub Desktop.
Server Handler -- Prototype Pattern
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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