适配器模式(Adapter Pattern)
1. 目的是什么:
将一个类的借口转换成客户希望的另一种类的借口。通过接口模式的使用,可以使得原来由于接口不兼容而不能正常工作的那些类可以一起工作。
假设有一个接口类Target是客户期望的。
有另一个接口Adaptee,是客户所不能直接对接工作的。
此时客户想对接Adaptee进行工作。
2. 实现思路:
通过将Target里对应的函数设置为虚函数。
并设计Adapter适配器类public继承自Target,private继承自Adaptee类。
这样就实现了Adapter接口类指针可以指向Target类对象,又能在内部执行Adaptee类的行为。
3. 两种模式:
类适配器模式,分别对应于在类定义阶段就实现了适配器模式。
对象适配器模式,在执行过程中,将原来不能直接对接的类的对象,通过对象适配器类动态的对接。
4. 上代码://基于QT
客户原始可对接接口:
H文件
#ifndefADAPTEE_H
#defineADAPTEE_H
#include<iostream>
usingnamespacestd;
classAdaptee
{
public:
Adaptee();
virtual~Adaptee();
virtualvoidspecial_request();
};
#endif//ADAPTEE_H
CPP文件
#include"adaptee.h"
Adaptee::Adaptee()
{
}
Adaptee::~Adaptee()
{
}
voidAdaptee::special_request()
{
cout<<"Adaptee::special_request()"<<endl;
}
客户希望对接接口:
H文件
#ifndefADAPTEE_H
#defineADAPTEE_H
#include<iostream>
usingnamespacestd;
classAdaptee
{
public:
Adaptee();
virtual~Adaptee();
virtualvoidspecial_request();
};
#endif//ADAPTEE_H
CPP文件
#include"adaptee.h"
Adaptee::Adaptee()
{
}
Adaptee::~Adaptee()
{
}
voidAdaptee::special_request()
{
cout<<"Adaptee::special_request()"<<endl;
}
类适配器接口:
H文件
#ifndefCLASSADAPTER_H
#defineCLASSADAPTER_H
#include"target.h"
#include"adaptee.h"
classclassadapter:publicTarget,privateAdaptee
{
public:
classadapter();
virtual~classadapter();
virtualvoidrequest();
};
#endif
CPP文件
#include"classadapter.h"
classadapter::classadapter()
{
}
classadapter::~classadapter()
{
}
voidclassadapter::request()
{
cout<<"classadapter::request()"<<endl;
this->special_request();
cout<<"-------------------------"<<endl;
}
对象适配器接口
H文件
#ifndefOBJECTADAPTER_H
#defineOBJECTADAPTER_H
#include<iostream>
#include"target.h"
#include"adaptee.h"
usingnamespacestd;
classobjectadapter:publicTarget
{
public:
objectadapter();
objectadapter(Adaptee*adaptee);
virtual~objectadapter();
virtualvoidrequest();
private:
Adaptee*_adaptee;
};
#endif//OBJECTADAPTER_H
CPP文件
#include"objectadapter.h"
objectadapter::objectadapter():_adaptee(newAdaptee)
{
}
objectadapter::objectadapter(Adaptee*adaptee)
{
_adaptee=adaptee;
}
objectadapter::~objectadapter()
{
}
voidobjectadapter::request()
{
cout<<"objectadapter::request()"<<endl;
_adaptee->special_request();
cout<<"---------------------------"<<endl;
}
实验文件
#include<QCoreApplication>
#include<iostream>
#include"target.h"
#include"adaptee.h"
#include"classadapter.h"
#include"objectadapter.h"
usingnamespacestd;
intmain(intargc,char*argv[])
{
QCoreApplicationa(argc,argv);
cout<<"Classadapter"<<endl;
Target*target1=newclassadapter();
target1->request();
cout<<endl<<endl;
cout<<"Objectadapter"<<endl;
Adaptee*adaptee=newAdaptee();
Target*target2=newobjectadapter(adaptee);
target2->request();
returna.exec();
}