Паттерн проектирования Bridge на C++

Начинающий
Статус
Оффлайн
Регистрация
17 Мар 2018
Сообщения
21
Реакции[?]
5
Поинты[?]
0
Расскажу немного про паттерн Bridge. Это моя первая статья, критика приветствуется.

Смысл данного шаблона разделить абстракцию и реализацию так, что поведение программы можно будет легко менять в рантайм. Удобно использовать, когда вы тестируете несколько разных вариантов поведения чита и хотите их сравнить, без перекомпиляции всего чита.
Коротко о том, как это работает: есть 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();
}
 
Забаненный
Статус
Оффлайн
Регистрация
22 Ноя 2018
Сообщения
137
Реакции[?]
28
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Можно и без этого сделать проще, просто выбирая тип аима в меню и меняя его в Чите через switch.
 
Начинающий
Статус
Оффлайн
Регистрация
17 Мар 2018
Сообщения
21
Реакции[?]
5
Поинты[?]
0
Можно и без этого сделать проще, просто выбирая тип аима в меню и меняя его в Чите через switch.
Ну в таком ключе можно вообще не использовать классы. Урок посвящён конкретно шаблону проектирования, а где его использовать ваш выбор. Я допустим не люблю потом в каждой функции проверять тип аима и плодить кучу switch везде, с тонной кода в каждом case и получать в итоге функции на 500 строк, мне нравится когда есть адекватное разделение реализации по классам.
 
Сверху Снизу