#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);
}
}
设计模式--适配器模式尝试
于 2023-11-28 17:09:06 首次发布