适配器模式(Adapter Pattern)是一种结构性设计模式,它允许接口不兼容的类之间进行协同工作。适配器模式充当两个不兼容接口之间的桥梁,使得它们能够协同工作而无需修改其源代码。
简而言之,适配器的目的就是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
适配器模式通常涉及到以下几个角色:
- 目标接口(Target) :客户端期望的接口,也是客户端代码直接调用的接口。适配器模式的目标是使适配器的接口符合目标接口。
- 适配器类(Adapter) :适配器模式的核心,它实现了目标接口,并包含一个对源接口的引用。适配器通过调用源接口的方法来实现目标接口,从而使得源接口的类能够与客户端代码协同工作。
- 源接口(Adaptee) :需要被适配的接口,即客户端代码不能直接使用的接口。适配器通过包装源接口,使其能够适配目标接口。
实现适配器有两种不同方式:
- 类适配器模式(Class Adapter Pattern):
类适配器模式使用多继承(C++)或接口继承(Java)来实现适配器。适配器类继承目标接口,并同时包含对源接口的引用。通过继承,适配器类既具有目标接口的特性,又能访问源接口的方法。
#include <iostream>
// 目标接口
class Target {
public:
virtual void request() const = 0;
};
// 源接口
class Adaptee {
public:
void specificRequest() const {
std::cout << "Adaptee specificRequest" << std::endl;
}
};
// 适配器类
class Adapter : public Target, private Adaptee {
public:
void request() const override {
std::cout << "Adapter request: ";
specificRequest();
}
};
// 客户端代码
void clientCode(const Target& target) {
target.request();
}
int main() {
Adapter adapter;
clientCode(adapter);
return 0;
}
在这个例子中,Adapter
类公开了目标接口 Target
,并通过继承 Adaptee
类来适配源接口的功能。Adapter
类的 request
方法调用了 specificRequest
方法,从而实现了适配。
- 对象适配器模式(Object Adapter Pattern):
在对象适配器模式中,适配器类通过组合关系包含源接口的对象,并实现目标接口。适配器类持有源接口对象的引用,并将其方法转换为目标接口的方法。
#include <iostream>
// 目标接口
class Target {
public:
virtual void request() const = 0;
};
// 源接口
class Adaptee {
public:
void specificRequest() const {
std::cout << "Adaptee specificRequest" << std::endl;
}
};
// 适配器类
class Adapter : public Target {
private:
Adaptee adaptee;
public:
void request() const override {
std::cout << "Adapter request: ";
adaptee.specificRequest();
}
};
// 客户端代码
void clientCode(const Target& target) {
target.request();
}
int main() {
Adapter adapter;
clientCode(adapter);
return 0;
}
在这个例子中,Adapter
类通过组合关系包含了 Adaptee
对象,并实现了目标接口 Target
的方法。Adapter
类的 request
方法调用了 specificRequest
方法,实现了适配。对象适配器模式更灵活,允许适配器适配多个源接口对象。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END