本文适合新手和小白
目录
1、Adapter
(1)意图
一个类的接口转换成客户希望的另一个接口,Adapte模式是的原本有与接口不兼容人不能一起工作的那些类可以一起工作
(2)结构
类适配器使用多重继承对一个接口与另一个接口进行匹配。
其中:1、target定义client使用的与特定领域相关的接口。
2、client与符合target接口的对象协同。
3、adaptee定义一个已经存在的接口,这个接口需要适配。
4、adapter对adaptee的接口与target接口进行适配。
该模式有两个类型一个是类适配器模式、一个是对象适配器模式
![对象适配器](https://img-blog.csdnimg.cn/eb1b7846cff64aceba8d48f88adcb5d9.jpeg)
![](https://img-blog.csdnimg.cn/139dcbf0ffc149f192139d8d4e8ab755.png)
(3)适用性
1、想使用一个已存在的类,而它的接口不符合要求。
2、想创建一个可以服用的类,该类可以与其他不相关的类或不可遇见的类协同工作。
3、想使用一个已经存在的子类,但是不可能对每一个都进行子类话以匹配他们的几口。对象适配器可以适配他们的父类接口。
Adapter:适配器 adptee:被适配者、源
2、根据UML图编写代码
(1)对象适配器
1.泛化关系
泛化关系体现为子类与父类之间的关系,本UML图adapter和targer为该关系,反应在代码上:
class target{
public:
virtual void request()=0;
virtual ~target(){}
};
class adapter:public target{
public:
void request(){
}
};
2.关联关系
我们可以将这个关系看做,一个类与另一个类之间有某种关联。它使一个类知道另一个类的属性和方法(实例变量体现)。A类依赖于B对象,并且把B作为A的一个成员变量, 则A和B存在关联关系.这种关联关系可以使用HAS-A表示。关联关系如果进行详细的划分,又可进一步分为单向关联、双向关联和自关联。本UMLadapter与adaptee形成单项关联。
class target{
public:
virtual void request()=0;
virtual ~target(){}
};
class adaptee{
public:
void specificrequest(){
}
};
class adapter:public target{
public:
adapter(){
a=new adaptee;
}
void request(){
}
adaptee *a;//adapter与adaptee形成关联通过a知道adaptee全部函数和方法
};
3.UML类图分析
有了这上述两段代码,本UML类的图的逻辑关系基本就清楚了,
1、client关联target,并使用她的request()方法
2、taregt是一个抽象类无法被实例化,所以会让自己的子类adapter来完成requset这个方法。
3、adapter这个requset方法最终是通过关联方式调用adaptee中的specificrequest()方法,并返回最终的结果
综上,client想通过target的requset得到最终结果,而这个结果只有adaptee(适配者)中的specificrequest()才能满足client的想法,于是通过adapter这个适配器从adaptee(适配者)找到对应的正确的方法并返回结果,这个过程我们可以把她理解为“适配”。
4.代码编写
我们可以理解为张三对我们说话,我们的大脑将他们的说的内容适配成我们能听懂的语言。
#include<iostream>
using namespace std;
class target{
public:
virtual void request()=0;
virtual ~target(){}
};
class adaptee{
public:
void specificrequest(){
cout<<"我的大脑给我适配成我能听懂的语言"<<endl;
}
};
class adapter:public target{
public:
adapter(){
a=new adaptee;
}
void request(){
cout<<"人张三对着我发出了想表达某种意义的声音"<<endl;
a->specificrequest();//我的大脑去我的语言区去寻找能听懂的张三在说什么的语言
}
adaptee *a;//adapter与adaptee形成关联通过a知道adaptee全部函数和方法
};
int main(){
target *a=new adapter;
a->request();
return 0;
}
(2)类适配器
1.泛化关系
这个UML泛化关系采用了多重继承的方式,即adapter有2 个父类,本方式其实并不建议使用,因为她并不太符合面向对象的逻辑,现在一些编辑器甚至就不接受这种模式,c++是支撑的
2.UML类图分析
本质上 类适配器和对象适配器大同小异,只是将适配方式从关联关系改为了继承关系。
3.代码编写
#include<iostream>
using namespace std;
class targert{
public:
virtual void request()=0;
virtual ~targert(){}
};
class adaptee{
public:
void speificreqest(){
cout<<"我的大脑将张三的话翻译成我能听懂的语言"<<endl;
}
};
class adapter:public targert,public adaptee{//多重继承
public:
void request(){
cout<<"张三发出了想表达某种意义的声音"<<endl;
adaptee::speificreqest();
}
};
int main(){
targert *p=new adapter;
p->request();
return 0;
}