Vous voudrez peut-être penser à utiliser la Command et/ou Strategy motifs. Le motif de commande semble être un bon ajustement pour le si/else externe tandis que le motif de la stratégie semble être un bon ajustement pour le commutateur interne.
cmd = Command->GetCommand(key);
cmd->Perform();
et pour effectuer la commande associée à l'espace clé
weapon = PlayState->GetCurrentWeapon();
weapon->Fire();
Notez ce dernier repose sur une cache globale/état de tenir l'arme actuelle (stratégie).
L'effet de ceci serait de déplacer la logique if/else dans la méthode d'usine où vous déterminez la commande en cours. Choisir quelle commande sélectionne l'une des branches if/else. Stocker l'arme actuelle dans l'état de jeu vous permet de choisir facilement la méthode de tir de l'arme à invoquer, ainsi la "logique" de l'arme à choisir est déplacée dans la logique de sélection d'arme pour l'état et "disparaît" entièrement. Chaque stratégie d'arme sait simplement comment exécuter sa propre logique «feu».
pour moi, il semble ok ... quel type est «clé»? –