适配器模式(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
方法,从而实现了适配。
在对象适配器模式中,适配器类通过组合关系包含源接口的对象,并实现目标接口。适配器类持有源接口对象的引用,并将其方法转换为目标接口的方法。
#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
方法,实现了适配。对象适配器模式更灵活,允许适配器适配多个源接口对象。
.post-copyright { box-shadow: 2px 2px 5px; line-height: 2; position: relative; margin: 40px 0 10px; padding: 10px 16px; border: 1px solid var(--light-grey); transition: box-shadow .3s ease-in-out; overflow: hidden; border-radius: 12px!important; background-color: var(--main-bg-color); } .post-copyright:before { position: absolute; right: -26px; top: -120px; content: '\f25e'; font-size: 200px; font-family: 'FontAwesome'; opacity: .2; } .post-copyright__title { font-size: 22px; } .post-copyright_type { font-size: 18px; color:var(--theme-color) } .post-copyright .post-copyright-info { padding-left: 6px; font-size: 15px; } .post-copyright-m-info .post-copyright-a, .post-copyright-m-info .post-copyright-c, .post-copyright-m-info .post-copyright-u { display: inline-block; width: fit-content; padding: 2px 5px; font-size: 15px; } .muted-3-color { color: var(--main-color); } /*手机优化*/ @media screen and (max-width:800px){.post-copyright-m-info{display:none}} ------本页内容已结束,喜欢请分享------