说下对适配器模式的理解:
适配器模式: 将一个类的接口转换成客户希望的另外一个接口, 他使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
ie, 系统的数据和行为都是正确的, 但是接口不服符合时, 我们就应该考虑使用适配器, 目的是使得控制范围之外的一个原有对象与某个接口匹配。 适配器模式主要应用于希望复用一些现存的类, 但是接口又与复用环境不一致的情况。
一般在后期维护, 或者调用第三方API的时候, 可以考虑使用, 前期或者重构的时候, 不建议使用这个模式。
UML:
运行效果:
code:
player.h
#ifndef _PLAYER_H_
#define _PLAYER_H_
#include <string>
/************************************************************************/
/* 球员类 */
/************************************************************************/
class CIPlayer{
public:
virtual void Attack() = 0;
virtual void Defense() = 0;
CIPlayer(std::string name){ this->name = name; }
protected:
std::string name;
};
#endif // _PLAYER_H_
mainplayer.h
#ifndef _MAINPLAYER_H_
#define _MAINPLAYER_H_
#include "player.h"
#include <iostream>
using std::cout;
using std::endl;
/************************************************************************/
/* 前锋 */
/************************************************************************/
class Forwards : public CIPlayer{
public:
Forwards(std::string name) : CIPlayer(name){}
void Attack() override{ cout << "前锋 " << name << " 进攻" << endl; }
void Defense() override{ cout << "前锋" << name << " 防守" << endl; }
};
/************************************************************************/
/* 中锋 */
/************************************************************************/
class Center : public CIPlayer{
public:
Center(std::string name) : CIPlayer(name){}
void Attack() override{ cout << "中锋 " << name << " 进攻" << endl; }
void Defense() override{ cout << "中锋" << name << " 防守" << endl; }
};
/************************************************************************/
/* 后卫 */
/************************************************************************/
class Guards : public CIPlayer{
public:
Guards(std::string name) : CIPlayer(name){}
void Attack() override{ cout << "后卫 " << name << " 进攻" << endl; }
void Defense() override{ cout << "后卫 " << name << " 防守" << endl; }
};
#endif // _MAINPLAYER_H_
adapter.h
#include "Adaptee.h"
#include "player.h"
#include <memory>
#include <string>
/************************************************************************/
/* 适配对象 */
/************************************************************************/
class Adapter : public CIPlayer{
public:
void Attack() override{ center->进攻(); }
void Defense() override{ center->防守(); }
Adapter(std::string name) : CIPlayer(name), center(new ForeignCenter(name)){}
private:
std::shared_ptr<ForeignCenter> center;
};
#endif // _ADAPTER_H_
adaptee.h
#ifndef _ADAPTEE_H_
#define _ADAPTEE_H_
#include <string>
#include <iostream>
using std::cout;
using std::endl;
/************************************************************************/
/* 外籍中锋 */
/************************************************************************/
class ForeignCenter{
public:
ForeignCenter(std::string name){ this->name = name; }
void 进攻() { cout << "中锋 " << name << " 进攻" << endl; }
void 防守() { cout << "中锋" << name << " 防守" << endl; }
private:
std::string name;
};
#endif //_ADAPTEE_H_
main.cpp
#include "MainPlayers.h"
#include "Adapter.h"
#include <iostream>
#include <memory>
using namespace std;
int main(){
shared_ptr<CIPlayer> asan(new Forwards("asan"));
asan->Attack();
shared_ptr<CIPlayer> lisi(new Guards("lisi"));
lisi->Attack();
shared_ptr<CIPlayer> yaom(new Adapter("yaom"));
yaom->Attack();
yaom->Defense();
system("pause");
return 0;
}