-
Автор темы
- #1
Расскажу немного про паттерн Bridge. Это моя первая статья, критика приветствуется.
Смысл данного шаблона разделить абстракцию и реализацию так, что поведение программы можно будет легко менять в рантайм. Удобно использовать, когда вы тестируете несколько разных вариантов поведения чита и хотите их сравнить, без перекомпиляции всего чита.
Коротко о том, как это работает: есть 2 основных класса:
1) [AimImplementation] - Базовый класс для типа аима, от которого мы в будущем наследуемся и создаём определённые типы поведения.
2) [AimAgent] - класс для управления текущим состояние аима
Остальные классы в лице SmartAim и HardAim являются реализациями нужного типа аима и служат примером.
AimAgent позволяет нам инкапсулировать механизм работы, и легко управлять настройками нашего Aim'а.
Ну к примеру вы пишите AimBot, и создаёте 2 класса с разным поведением, в одном случае вы просто пускаетесь в раш, в другом случае аимбот более скрытный, чтобы не палиться.
С помощью такого шаблона мы можем легко и динамично управлять конфигурацией нашего Aimbot'a.
Смысл данного шаблона разделить абстракцию и реализацию так, что поведение программы можно будет легко менять в рантайм. Удобно использовать, когда вы тестируете несколько разных вариантов поведения чита и хотите их сравнить, без перекомпиляции всего чита.
Коротко о том, как это работает: есть 2 основных класса:
1) [AimImplementation] - Базовый класс для типа аима, от которого мы в будущем наследуемся и создаём определённые типы поведения.
2) [AimAgent] - класс для управления текущим состояние аима
Остальные классы в лице SmartAim и HardAim являются реализациями нужного типа аима и служат примером.
AimAgent позволяет нам инкапсулировать механизм работы, и легко управлять настройками нашего Aim'а.
Ну к примеру вы пишите AimBot, и создаёте 2 класса с разным поведением, в одном случае вы просто пускаетесь в раш, в другом случае аимбот более скрытный, чтобы не палиться.
C++:
// AimImplementation.h
class AimImplementation
{
public:
AimImplementation() {};
virtual Vector3f calcTargetCords(int bone) = 0;
}
class HardAim : public AimImplementation;
{
public:
HardAim() : AimImplementation() {};
virtual Vector3f calcTargetCords(int bone);
}
class SmartAim : public AimImplementation;
{
public:
SmartAim() : AimImplementation() {};
virtual Vector3f calcTargetCords(int bone);
}
// AimImplementation.cpp
Vector3f HardAim::calcTargetCords(int bone)
{
//наш код подсчитывающий координаты для хардкорного аима
return Vector3f(x, y, z);
}
Vector3f SmartAim::calcTargetCords(int bone)
{
//наш код подсчитывающий координаты для другого аима
return Vector3f(x, y, z);
}
C++:
//AimAgent.h
#include "AimImplementation.h"
class AimAgent
{
public:
enum AimType { Hard, Smart };
AimAgent(AimImplementation* ptr);
virtual ~AimAgent();
Vector3f getTarget(int bone);
bool SetType(AimType type);
protected:
AimImplementation* implement;
};
//AimAgent.cpp
AimAgent::AimAgent(AimImplementation* ptr) : implement(ptr) {};
AimAgent::~AimAgent()
{
delete implement;
};
Vector3f AimAgent::getTarget(int bone)
{
return implement->calcTargetCords(bone);
}
bool AimAgent::SetType(AimType type)
{
try
{
switch (type)
{
case AimType::Hard: implement = new HardAim(); break;
case AimType::Smart: implement = new SmartAim(); break;
}
} catch ( std::bad_alloc )
{
return false;
}
return true;
}
С помощью такого шаблона мы можем легко и динамично управлять конфигурацией нашего Aimbot'a.
C++:
void somefunc()
{
getAimAgent()->SetType(AimAgent::AimType::Smart);
Vector3f headCords = getAimAgent()->getTarget(BONE_HEAD);
moveCrosshairTo(headCords);
shoot();
}