设计模式--适配器模式尝试


#include <iostream>
#include <string>
#include <queue>
#include <format>


template <typename... _Types>
void print(const std::format_string<_Types...> _Fmt, _Types&&... _Args) {
    std::cout << vformat(_Fmt.get(), _STD make_format_args(_Args...));
}

/* 游戏码 */
#define err_code -32768
class GameCode {
public:
    void saveCode(int code) {
        m_dir.push(code);
    }
    int getCode() {
        if (!m_dir.empty()) {
            int game_code = m_dir.front();
            m_dir.pop();
            return game_code;
        }
        else
        {
            return err_code;
        }
    }
private:
    std::queue<int> m_dir; // 方向
};

/* 外设码 */
class AbstractCode
{
public:
    virtual int getcode() = 0;
    virtual void recvInfo(const int code[]) = 0;
    virtual ~AbstractCode() = default;
};


class IRCode : public AbstractCode
{
public:

    int getcode() override {
        /* 根据设备分配code 省略... */
        int code = m_code;
        m_code = 0;
        m_dev = 0;
        return code;
    }

    void recvInfo(const int code[])  override {
        m_dev = code[0];
        m_code = code[1];
    }
private:
    int m_dev;
    int m_code;
};


class RounteEncodeCode : public AbstractCode
{
public:
    int getcode() override {
        int code = m_code;
        m_code = 0;
        return code;
    }

    void recvInfo(const int code[])  override {
        m_code = code[0];
    }
private:
    int m_code;
};


/* 适配器 */
class AbstractAdapter {
public:
    AbstractAdapter(GameCode* gameCode, AbstractCode* pCode) : m_gameCode(gameCode), m_pCode(pCode) { }
    virtual void translate2GameCode() = 0;
    virtual void translate2OriginalCode() = 0;
    virtual ~AbstractAdapter() { }
protected:
    GameCode* m_gameCode;
    AbstractCode* m_pCode;
};


class IRCodeAdapter : public AbstractAdapter {
public:
    using AbstractAdapter::AbstractAdapter;
    void translate2GameCode() {
        switch (m_pCode->getcode())
        {
        case 0x55:
            m_gameCode->saveCode(-1);
            break;
        case 0x58:
            m_gameCode->saveCode(1);
            break;
        }
    }
    void translate2OriginalCode() {
        int code = m_gameCode->getCode();
        int arr_code[2] = { 0 };
        if (code == 1) {
            arr_code[1] = 0x55;
        }
        else
        {
            arr_code[1] = 0x58;
        }
        m_pCode->recvInfo(arr_code);
    }
};

class RounteEncodeCodeAdapter : public AbstractAdapter {
public:
    using AbstractAdapter::AbstractAdapter;
    void translate2GameCode() {
         int Info = m_pCode->getcode();
         int num = abs(Info);
         int dir = Info > 0 ? 1 : -1;
         if (num > 5)
         {
             num = 5;
         }
         for (size_t i = 0; i < num; i++)
         {
             m_gameCode->saveCode(dir);
         }
    }
    void translate2OriginalCode() {
        int num = 0;
        for(;;) {
            int code = m_gameCode->getCode();
            if (code == err_code || num >= 5)
                break;
            num++;
        }
        m_pCode->recvInfo(&num);
    }
};

int main()
{
    GameCode game_code;
    AbstractCode* code = new IRCode;
    AbstractAdapter* adpter = new IRCodeAdapter(&game_code, code);

    /* 红外码转译 */
    int ir_code[2] = { 0x34, 0x55 };
    code->recvInfo(ir_code);
    adpter->translate2GameCode();
    ir_code[1] = 0x58;
    code->recvInfo(ir_code);
    adpter->translate2GameCode();
    delete adpter;
    delete code;

    /* 旋转编码器转译 */
    code = new RounteEncodeCode;
    adpter = new RounteEncodeCodeAdapter(&game_code, code);
    int rounte_code = -10;
    code->recvInfo(&rounte_code);
    adpter->translate2GameCode();
    delete adpter;
    delete code;

    /* 游戏处理 */
    for (;;) {
        int code = game_code.getCode();
        if (code == err_code)
            break;
        print("dir: {}\n", code);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值