Merhaba;
Bir oyun farzedelim ve bu oyunda F'ye basınca ateş edeceğiz, G'ye basınca silah değiştireceğiz ve Space'e basınca da zıplayacağız. Bunun en basit ve doğal olan kodu şu şekilde:
void InputHandler::handle_input()
{
if (is_pressed(BUTTON_F)) fire_gun(); // Ateş et.
else if (is_pressed(BUTTON_G)) swap_weapon(); // Silahı değiştir.
else if (is_pressed(BUTTON_SPACE)) jump(); // Karakteri zıplat.
}
Bunu command design pattern ile şu şekilde tasarlayabiliriz:
class Command
{
public:
virtual void execute() = 0;
};
class FireCommand : public Command
{
public:
virtual void execute() override
{
fire_gun(); // Ateş et.
}
};
class SwapWeaponCommand : public Command
{
public:
virtual void execute() override
{
swap_weapon(); // Silahı değiştir.
}
};
class JumpCommand : public Command
{
public:
virtual void execute() override
{
jump(); // Zıpla.
}
};
class InputHandler
{
private:
FireCommand* _buttonF;
SwapWeaponCommand* _buttonG;
JumpCommand* _buttonSPACE;
public:
static Command* handle_input()
{
if (is_pressed(BUTTON_F)) return _buttonF;
else if (is_pressed(BUTTON_G)) return _buttonG;
else if (is_pressed(BUTTON_SPACE)) return _buttonSPACE;
}
};
// Kullanımı:
int main()
{
Command* command = InputHandler::handle_input();
if (command)
{
command->execute();
}
return 0;
}
Sorum şu ki en başta da gösterdiğim gibi if - else ile hangi buton basıldıysa gerekli fonksiyonu / üye fonksiyonu çağırmak daha kısa ve anlaşılırken Command design pattern'a niçin ihtiyaç duyalım? Bunun bize tam anlamıyla faydası nedir? Birkaç örnek inceledim bu desen ile ilgili ama hiçbiri bu desenin gerekliliği hakkında bir fikir tam olarak oluşturmadı.
Teşekkürler.
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]