适配器模式:将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
目的是使控制范围之外的一个原有对象与某个接口匹配。
适用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。
适配器模式有两种类型:类适配器模式和对象适配器模式。
类适配器代码:
//类适配器
#include <iostream>
#include <string>
using namespace std;
class Player
{
public:
Player(string name)
{
this->name = name;
}
virtual void Attack() = 0;
virtual void Defense() = 0;
protected:
string name;
};
class Forwards : public Player
{
public:
Forwards(string name) : Player(name)
{
}
void Attack()
{
cout << "前锋" << name << "进攻" << endl;
}
void Defense()
{
cout << "前锋" << name << "防守" << endl;
}
};
class Center : public Player
{
public:
Center(string name) : Player(name)
{
}
void Attack()
{
cout << "中锋" << name << "进攻" << endl;
}
void Defense()
{
cout << "中锋" << name << "防守" << endl;
}
};
class Guards : public Player
{
public:
Guards(string name) : Player(name)
{
}
void Attack()
{
cout << "后卫" << name << "进攻" << endl;
}
void Defense()
{
cout << "后卫" << name << "防守" << endl;
}
};
class ForeignCenter
{
public:
string getName()
{
return name;
}
void setName(string value)
{
name = value;
}
void jingong()
{
cout << "外籍中锋" << name << "进攻" << endl;
}
void fangshou()
{
cout << "外籍中锋" << name << "防守" << endl;
}
private:
string name;
};
class Translater: public Player,ForeignCenter
{
public:
Translater(string name) : Player(name)
{
setName(name);
}
void Attack()
{
jingong();
}
void Defense()
{
fangshou();
}
};
int main()
{
Player* b = new Forwards("巴蒂尔");
b->Attack();
Player* m = new Guards("麦克格雷迪");
m->Attack();
Player* ym = new Translater("姚明");
ym->Attack();
ym->Defense();
return 0;
}
对象适配器代码:
//类适配器
#include <iostream>
#include <string>
using namespace std;
class Player
{
public:
Player(string name)
{
this->name = name;
}
virtual void Attack() = 0;
virtual void Defense() = 0;
protected:
string name;
};
class Forwards : public Player
{
public:
Forwards(string name) : Player(name)
{
}
void Attack()
{
cout << "前锋" << name << "进攻" << endl;
}
void Defense()
{
cout << "前锋" << name << "防守" << endl;
}
};
class Center : public Player
{
public:
Center(string name) : Player(name)
{
}
void Attack()
{
cout << "中锋" << name << "进攻" << endl;
}
void Defense()
{
cout << "中锋" << name << "防守" << endl;
}
};
class Guards : public Player
{
public:
Guards(string name) : Player(name)
{
}
void Attack()
{
cout << "后卫" << name << "进攻" << endl;
}
void Defense()
{
cout << "后卫" << name << "防守" << endl;
}
};
class ForeignCenter
{
public:
string getName()
{
return name;
}
void setName(string value)
{
name = value;
}
void jingong()
{
cout << "外籍中锋" << name << "进攻" << endl;
}
void fangshou()
{
cout << "外籍中锋" << name << "防守" << endl;
}
private:
string name;
};
class Translater: public Player,ForeignCenter
{
public:
Translater(string name) : Player(name)
{
wjzf.setName(name);
}
void Attack()
{
wjzf.jingong();
}
void Defense()
{
wjzf.fangshou();
}
private:
ForeignCenter wjzf;
};
int main()
{
Player* b = new Forwards("巴蒂尔");
b->Attack();
Player* m = new Guards("麦克格雷迪");
m->Attack();
Player* ym = new Translater("姚明");
ym->Attack();
ym->Defense();
return 0;
}