Возможно, вы захотите подумать об использовании шаблонов Command и / или Strategy .Шаблон Command кажется подходящим для внешнего if / else, в то время как шаблон Strategy кажется подходящим для внутреннего переключателя.
cmd = Command->GetCommand( key );
cmd->Perform();
и в Perform для команды, связанной с клавишей пробела
weapon = PlayState->GetCurrentWeapon();
weapon->Fire();
Обратите внимание, что последний использует некоторый глобальный кеш / состояние для хранения текущего оружия (стратегии).
Результатом этого будет перемещение логики if / else в фабричный метод, гдеВы определяете текущую команду.Выбор какой команды выбирает одну из ветвей if / else.Хранение текущего оружия в игровом состоянии позволяет вам легко выбирать, какой метод огня активировать, таким образом, переключатель «логика», для которого выбирается оружие, перемещается в логику выбора оружия для состояния и полностью «исчезает».Каждая стратегия оружия просто знает, как выполнить свою собственную "огненную" логику.