1.概述
适配器模式是一种结构型设计模式, 又称为变压器模式、包装模式(Wrapper) 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
2.结构
- Target:适配器的内容,例如客户端使用的目标接口;
- Adaptee:被适配的内容,例如不兼容的接口;
-
Adapter:适配器,把 Adaptee 适配成
Target
。
3.实现
3.1 实例类比
在生活中存在各类适配器,交流电220V会转化为各类所需电压, 以手机适配器为例。在给手机充电 手机充电器相当于 Adapter适配器 ,220V的交流电 相当于 Adaptee 被适配者,5V的直流电 相当于 Target目标
3.2 具体实现
#include <iostream>
#include <string>
using namespace std;
//被适配类即待转化的类
class Adaptee {
public:
int OutPut220V() {
std::cout << "正常220V电压..." << endl;
return 220;
}
};
//转化目标
class Target {
public:
virtual int OutPut5V()=0;
};
//适配器
class Adapter :public Target {
public:
int OutPut5V() {
//输入的待转化电压
int a = inPut_->OutPut220V();
//转化方法
int b = a / 44;
//返回转化结果
std::cout << "220V电压转化为5V电压..." << endl;
return b;
}
void SetInpt(Adaptee * inPut) {
inPut_ = inPut;
}
private:
Adaptee * inPut_;
};
int main()
{
Adaptee * input_ = new Adaptee();
Adapter * adater_ = new Adapter();
adater_->SetInpt(input_);
adater_->OutPut5V();
return 0;
}
3.3运行结果
4.状态设计模式优缺点
优点:
- 将目标类和适配者类解耦
- 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
- 灵活性和扩展性都非常好,符合开闭原则。如果不想用就可以卸载适配器
缺点:
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。
- 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
5 应用场景
- 两个类所做的事情相同或相似,但是具有不同的接口时要使用
- 在双方都不太容易修改的时候再使用适配器模式适配,而不是一有不同时就使用它。
- 系统需要使用一些现有的类,而这些类的接口与系统要求的接口不兼容。
- 需要创建一个可复用的类,该类与一些不兼容的类合作工作,而不是修改这些类的代码。
- 在已有的系统中,希望增加一些额外的功能,而这些功能需要与已有的类协同工作,但是不能对这些类进行修改。