天天看點

設計模式-擴充卡模式 C++實作

擴充卡模式

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

對象适配模式如下:

隻需要修改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();
}
           

繼續閱讀