学习笔记:适配器模式
模式简介
:属于结构型模式,是两个不兼容的接口之间的桥梁。
为什么用
:让两个独立的类的接口产生联系,本来A类和B类没关系,我在B类写个兼容的接口,让接口可以接受A类的对象,就能让B类的方法使用A类进行操作了。
怎么样用
:写个B类的适配器类,类里提供要适配的方法,A类继承并实现这个适配器的方法,在B类里,通过适配器调用A类实现的适配的方法。
注意事项
:只在特别需要的时候才用适配器,过多的使用,代码不好看。
实际举例
:创意工坊,游戏显示自定义的物品信息。
#include <iostream>
#include <Windows.h>
using namespace std;
//ShowTool对象提供的Adapter(适配器接口)。
class ShowToolAdapter {
public:
virtual void showMessage(string message) {
cout << "待实现的显示方法\n";
};
};
/*ShowTool游戏显示工具使用showMessage方法就能显示DiyItem对象的信息
这需要DiyItem对象实现ShowTool的Adapter(适配器接口),即成为它的子类*/
class DiyItem_ShowToolAdapter :public ShowToolAdapter {
public:
void showMessage(string message) {
cout << "---自定义物品---\n";
string text[] = { "武器","攻击","暴击率" };
int tot = 0;
cout << text[tot++] << ":";
for (int i = 0; i < message.size(); ++i) {
cout << message[i];
if (message[i] == '\n') {
cout << text[tot++] << ":";
}
}
cout << "\n";
};
};
//ShowTool游戏显示工具,用来显示对象的信息
class ShowTool {
ShowToolAdapter *showToolAdapter;
public:
//一开始只支持显示人物的信息
void showMessage(string type,string message) {
//游戏自带类型
if (type == "人物") {
string text[] = { "名字","血量","蓝量" };
int tot = 0;
cout << "---人物---\n";
cout << text[tot++] << ":";
for (int i = 0; i < message.size(); ++i) {
cout << message[i];
if (message[i] == '\n') {
cout<< text[tot++] << ":";
}
}
cout << "\n";
}
//在此添加新的类型
else if (type == "自定义物品") {
showToolAdapter = new DiyItem_ShowToolAdapter();
showToolAdapter->showMessage(message);
}
else {
cout << "---不支持---\n";
cout << "该类型的信息不支持显示\n";
}
}
};
int main()
{
//游戏显示工具
ShowTool st;
//游戏显示工具-只能显示人物(等已实现的类型)信息
st.showMessage("人物","moota\n100\n100");
//自定义物品不支持显示,就必须自己写适配器(已实现)
st.showMessage("自定义物品","无尽之刃\n180\n25");
//未写适配器的物品不支持显示
st.showMessage("未知物品","22\n33");
return 0;
}