前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GoF 23种经典的设计模式——适配器模式

GoF 23种经典的设计模式——适配器模式

作者头像
Andromeda
发布2024-01-18 09:19:31
1170
发布2024-01-18 09:19:31
举报
文章被收录于专栏:Andromeda的专栏

适配器模式(Adapter Pattern)是一种结构性设计模式,它允许接口不兼容的类之间进行协同工作。适配器模式充当两个不兼容接口之间的桥梁,使得它们能够协同工作而无需修改其源代码。

简而言之,适配器的目的就是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

适配器模式通常涉及到以下几个角色:

  1. 目标接口(Target) :客户端期望的接口,也是客户端代码直接调用的接口。适配器模式的目标是使适配器的接口符合目标接口。
  2. 适配器类(Adapter) :适配器模式的核心,它实现了目标接口,并包含一个对源接口的引用。适配器通过调用源接口的方法来实现目标接口,从而使得源接口的类能够与客户端代码协同工作。
  3. 源接口(Adaptee) :需要被适配的接口,即客户端代码不能直接使用的接口。适配器通过包装源接口,使其能够适配目标接口。

实现适配器有两种不同方式:

  • 类适配器模式(Class Adapter Pattern):

类适配器模式使用多继承(C++)或接口继承(Java)来实现适配器。适配器类继承目标接口,并同时包含对源接口的引用。通过继承,适配器类既具有目标接口的特性,又能访问源接口的方法。

代码语言:javascript
复制
#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):

在对象适配器模式中,适配器类通过组合关系包含源接口的对象,并实现目标接口。适配器类持有源接口对象的引用,并将其方法转换为目标接口的方法。

代码语言:javascript
复制
#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}} ------本页内容已结束,喜欢请分享------

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档