首页 - 信息 - 设计模式6.适配器模式 适配器

设计模式6.适配器模式 适配器

2023-10-04 03:17
解释:将一个类的接口转换成客户想要的另一个接口。适配器模式允许具有不兼容接口的类一起工作
目标接口(Target):当前系统期望的接口,可以是抽象类或接口
Adaptee:是现有组件库中被访问和适配的组件接口
Adapter:是一个转换器,通过继承或引用适配器对象,将适配器接口转换为目标接口,让客户以目标接口的格式访问适配器。
从实现层面来说,适配器模式分为两种:
类适配器(多重继承)
对象适配器(对象组合方法)
那么,实际应用中两者如何选择呢?
类适配器包括以下功能:
由于Adapter直接继承自Adaptee类,因此可以在Adapter类中重新定义Adaptee类的方法。
如果在Adaptee中添加抽象方法,那么Adapter也必须相应改变,这会导致高耦合。
如果Adaptee还有其他子类,并且您想在Adapter中调用其他Adaptee子类的方法,则无法使用类适配器来实现。
对象适配器包括以下功能:
有时候,你会发现构造一个Adaptee类型的对象并不容易。
当Adaptee中添加新的抽象方法时,Adapter类不需要做任何调整,就可以正确动作。
可以使用多态性来调用Adapter类中Adaptee类子类的方法。
因为对象适配器的耦合度比较低,所以很多书中都推荐使用对象适配器。我们实际项目中也是如此。如果我们可以使用对象组合,我们就不会使用多重继承。
优点:
您可以让任意两个不相关的类一起运行
改进类重用
增加了类别透明度
柔韧性好
缺点:
过多使用适配器会让系统变得非常混乱,不利于整体控制。
比如你看到调用了A接口,但内部却适配了B接口的实现,如果系统中出现太多类似的情况,那无异于一场灾难。因此,如果没有必要,可以直接重构系统,而不需要使用适配器。
适用场景
当你想使用一个已有的类但它的接口不满足要求时。
您想要创建一个可重用的类,可以与其他不相关或不可预见的类一起使用。
您想要使用一些现有的子类,但不可能对每个子类进行子类化以匹配其接口。对象适配器可以适应其父接口。
适配器模式分为类适配器和对象适配器。
Jungle 在项目中多次使用了适配器模式。这是使用对象适配器模式的示例。
路径规划包括两个阶段:首先,读取并解析工程图文件,获取点和直线坐标;其次,根据要求计算加工路径。在软件控制器(Controller)上,通过点击“路径规划”按钮,系统自动完成上述过程。
Jungle封装了一个类DxfParser,它可以读取后缀为dxf的工程图文件,解析其中的点和线,并保存到路径列表中。另一个类PathPlanner用于计算加工路径
在此示例中,Controller 是目标抽象类,DxfParser 和 PathPlanner 是适配器类。这两个类提供的方法可以用来实现路径规划的需求。我们只需要定义另一个适配器类Adapter
#pragma Once
#包括使用命名空间 std;
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){删除(p); (p)=NULL;} }
#万一
// 附带充电器 - 两脚扁平型
自带充电器类
{
public:void ChargeWithFeetFlat() {cout << "OwnCharger::chargeWithFeetFlat" << endl;}
};
// 俄罗斯提供的套接字
IRussiaSocket 类
{
public:// 使用两足循环充电 virtual void Charge() = 0;
};
// 电源适配器
PowerAdapter 类:公共 IRussiaSocket
{
public:PowerAdapter() : m_pCharger(new OwnCharger()) {}~PowerAdapter() {SAFE_DELETE(m_pCharger);}void Charge() {// 使用自己的充电器(两脚扁平型)充电 m_pCharger->ChargeWithFeetFlat ();}
私有:OwnCharger* m_pCharger; // 保存需要适配的接口对象——内置充电器
};#include“适配器.h”
int main()
{//创建适配器 IRussiaSocket* pAdapter = new PowerAdapter();//充电 pAdapter->Charge();SAFE_DELETE(pAdapter);getchar();return 0;
}