1. 意图
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2. 动机
有时,为复用而设计的工具箱类不能够被复用的原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配。分为两种,一种是类适配器,另外一种是对象适配器。
3. 实例
Student类表示学生群体,Teacher类表示教师群体,学生可以进行学习的行为,教师进行教书的工作,但是有些学生申请了助教,因此可以做教师的教书行为,此时我们需要对这类群体进行适配构造Assitant类,用到了类适配器模式,该类公有继承Student类(接口继承),私有继承Teacher类(实现继承)。
C++ 代码:
#ifndef ADAPTER_H
#define ADAPTER_H
#include <iostream>
using std::cout;
using std::endl;
class Student{
public:
void Study(){
cout<<"I am studying!"<<endl;
};
virtual void Other()=0;
};
class Teacher{
public:
virtual void Teach(){
cout<<"I am teaching!"<<endl;
}
};
class Assistant : public Student, private Teacher{
public:
virtual void Other(){
Teach();
}
};
#endif
#include <iostream>
#include "adapter.h"
int main(){
Assistant example;
example.Other();
}
People类表示人类群体,Car类表示车辆,人类可以进行吃的动作,车子可以做行驶的行为。为了让驾驶员可以进行驾驶的动作,我没使用对象适配器模式构造一个CarDriver类完成驾驶的行为,该类继承People类的Other接口,通过包含Car类对象完成驾驶动作的调用。
C++ 代码:
#ifndef ADAPTEROBJECT_H
#define ADAPTEROBJECT_H
#include <iostream>
using std::cout;
using std::endl;
class People{
public:
void Eat(){
cout<<"I am eating"<<endl;
}
virtual void Other()=0;
};
class Car{
public:
void Drive(){
cout<<"I am driving"<<endl;
}
};
class CarDriver : public People{
private:
Car m_Car;
public:
virtual void Other(){
m_Car.Drive();
}
};
#endif
#include <iostream>
#include "adapterobject.h"
int main(){
CarDriver Jim;
Jim.Eat();
Jim.Other();
}