187Fermer189
SasumeLe 28/04/2010 à 10:49
Ouais, le truc un peu chiant, c’est que c’est un élément à l’intérieur d’un module qui doit activer le switch de modules, alors qu’un module n’a pas forcément connaissance des autres modules.
[nosmile]
La solution très simple, c’est que chaque module connaisse le TaskManager, comme ça il peut directement lui dire quoi faire en fonction des boutons qui sont cliqués. Mais du coup ça introduit un couplage entre les modules et le TaskManager…

Pour découpler ça, il faut que chaque module ne fasse que « notifier » un observateur (qui sera le TaskManager) quand un événement important a lieu. Tu peux jeter un coup d’œil au design pattern Observer.

Je pense que ça n’est pas si grave que chaque Module connaisse le TaskManager (parce que sinon on n’en finit pas de mettre de la distance entre les classes, il y a bien un moment où il faut s’arrêter…).
class TaskManager { public: TaskManager(); void loadTitle(); void startGame(); void mainLoop(); private: Module *activeModule; Module *titleModule; Module *gameModule; boolean quit; }; TaskManager::TaskManager() { titleModule = new TitleModule(this); gameModule = new GameModule(this); activeModule = titleModule; quit = false; } void TaskManager::loadTitle() { activeModule = titleModule; } void TaskManager::startGame() { activeModule = gameModule; } void TaskManager::mainLoop() { while (!quit) { activeModule->run(); } } typedef void (*CallBack)(void); class Icon : public Component { public: Icon(CallBack callBack); void onClicked(); private: Callback callBack; }; Icon::Icon(CallBack callBack) { this->callBack = callBack; } void Icon::onClicked() { callBack(); } class Module { public: virtual void run() = 0; }; class TitleModule : public StaticModule { public: TitleModule(TaskManager *tm); private: Icon *startGame; }; TitleModule::TitleModule(TaskManager *tm) { startGame = new Icon(tm->startGame); } void TitleModule::run() { // s’afficher et gérer les icônes // si une icône est cliquée, appeler // son opération onClicked }