适配器模式
定义:将一个类的接口转化为客户希望的另外一个接口,是的原本由于接口不兼容而不能在一起工作的那些类能一起工作。
特点:(1)客户端通过适配器可以透明的调用目标接口.(2)程序员不需要修改原有代码而重用现有的适配者类。(3)将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
主要角色 目标接口(Target),适配者类(Adaptee,被转换为的对象)适配器(Adapter)
适配器模式有:类适配模式和对象适配模式。前者是通过多继承实现,后者是把在适配器内部实例化一个适配者(转化为的对象)实现
具体例子:手机接口有USB和TypeC,适配器就是一个USB转为Type C的一个转换器。
类适配模式如下:
Target.h
#pragma once
class Target {
public:
Target();
~Target();
virtual void Request();
};
Adaptee.h
#pragma once
class Adaptee {
public:
Adaptee();
~Adaptee();
virtual void SpecificalRequest();
};
Adapter.h
#pragma once
#include"Target.h"
#include"Adaptee.h"
//这里通过private继承,表示转化是单向的只能把Target转化为Adaptee
class Adapter:public Target,private Adaptee{
public:
Adapter();
~Adapter();
void Request();
};
Target.cpp
#include"Target.h"
#include<iostream>
using namespace std;
Target::Target() {
cout << "USB" << endl;
}
Target::~Target() {
}
void Target::Request() {
cout << "This is USB connector" << endl;
}
Adaptee.cpp
#include"Adaptee.h"
#include<iostream>
using namespace std;
Adaptee::Adaptee() {
cout << "TypeC" << endl;
}
Adaptee::~Adaptee() {
}
void Adaptee::SpecificalRequest() {
cout << "This is TypeC connector" << endl;
}
Adapter.cpp
#include"Adapter.h"
#include<iostream>
using namespace std;
Adapter::Adapter() {
cout << "Switch" << endl;
}
Adapter::~Adapter() {
}
void Adapter::Request() {
this->SpecificalRequest();
}
main.cpp
#include"Target.h"
#include"Adapter.h"
int main(void) {
Target* t = new Adapter();
t->Request();
return 0;
}
对象适配模式如下:
只需要修改Adapter类即可,如下
Adapter.h
#pragma once
#include"Target.h"
#include"Adaptee.h"
class Adapter:public Target{
public:
Adapter();
~Adapter();
void Request();
private:
Adaptee* adpatee;
};
Adapter.cpp
#include"Adapter.h"
#include<iostream>
using namespace std;
Adapter::Adapter() {
cout << "Switch" << endl;
this->adpatee = new Adaptee();
}
Adapter::~Adapter() {
}
void Adapter::Request() {
this->adpatee->SpecificalRequest();
}