天天看点

设计模式-适配器模式 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();
}
           

继续阅读