擴充卡模式
定義:将一個類的接口轉化為客戶希望的另外一個接口,是的原本由于接口不相容而不能在一起工作的那些類能一起工作。
特點:(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();
}