不得不说的结构型模式-适配器模式

适配器模式(AdapterPattern)解释与C++实现
适配器模式是结构型设计模式,用于将不同接口的类协同工作。它通过对象适配器或类适配器实现接口转换,允许不兼容的类协同。文章提供了一个C++示例,展示如何将Adaptee类的SpecificRequest方法转换成ITarget接口的Request方法。适配器模式提高了代码复用性和可维护性,但可能增加代码复杂度和影响性能。

适配器模式(Adapter Pattern)是结构型模式之一,它将一个类的接口转换成客户希望的另一个接口,从而使原本由于接口不兼容而不能一起工作的类能够协同工作。适配器模式包括对象适配器和类适配器两种实现方式。

 

在对象适配器中,适配器通过包装一个需要适配的对象来实现接口转换,它将需要适配的对象作为成员变量,同时实现目标接口。在客户端调用目标接口时,适配器会将调用委托给被适配的对象,并根据需要进行接口转换和适配。在类适配器中,适配器通过多重继承来实现接口转换,它继承需要适配的类和目标接口,同时重写目标接口中的方法来实现接口转换。

以下是一个使用对象适配器实现的适配器模式的示例代码:

// 需要适配的接口
class ITarget {
public:
    virtual void Request() = 0;
};

// 需要适配的类
class Adaptee {
public:
    void SpecificRequest() {
        std::cout << "Adaptee::SpecificRequest()" << std::endl;
    }
};

// 对象适配器
class Adapter : public ITarget {
public:
    Adapter(Adaptee* adaptee) : m_adaptee(adaptee) {}

    virtual void Request() override {
        std::cout << "Adapter::Request()" << std::endl;
        m_adaptee->SpecificRequest();
    }

private:
    Adaptee* m_adaptee;
};

int main() {
    Adaptee* adaptee = new Adaptee();
    ITarget* target = new Adapter(adaptee);
    target->Request();

    delete target;
    delete adaptee;

    return 0;
}

在这个示例代码中,我们需要将Adaptee类的SpecificRequest()方法适配成ITarget接口的Request()方法,我们定义了ITarget接口和Adaptee类,并在Adapter类中通过包装Adaptee对象来实现接口转换。在客户端中,我们通过创建Adaptee对象和Adapter对象,然后将Adapter对象传递给客户端,客户端就可以调用目标接口Request()方法来访问Adaptee对象的SpecificRequest()方法了。

适配器模式的实际应用非常广泛,例如在新旧系统的数据交换中,可能需要将一种数据格式转换成另一种数据格式,可以使用适配器模式来实现;在使用第三方库时,可能需要将第三方库的接口转换成自己的接口,可以使用适配器模式来实现;在复用旧代码时,可能需要将旧代码的接口转换成新的接口,可以使用适配器模式来实现。通过使用适配器模式,我们可以

复用现有代码和接口,避免修改原有代码和接口,从而减少风险。

适配器模式的好处包括:

  1. 适配器模式可以让两个原本不兼容的接口能够协同工作,提高代码的复用性和可维护性;
  2. 适配器模式可以避免修改原有的代码和接口,从而减少风险和工作量;
  3. 适配器模式可以将适配的代码和接口与客户端代码解耦,提高代码的灵活性和可扩展性。

适配器模式的缺点包括:

  1. 适配器模式可能会增加代码的复杂度,特别是在涉及多个适配器的情况下;
  2. 适配器模式可能会影响代码的性能,因为需要进行接口转换和适配;
  3. 适配器模式可能会隐藏原有代码和接口的缺陷和问题,需要谨慎使用。

适配器模式是一种非常有用的结构型设计模式,可以将两个不兼容的接口协同工作,提高代码的复用性和可维护性,同时也需要注意其可能带来的复杂度和性能问题。

下面我们用 C++ 代码来实现一个简单的适配器模式示例。

首先,我们定义一个目标接口 Target,包含一个输出字符串的纯虚函数 output()

class Target {
public:
    virtual ~Target() = default;
    virtual void output() const = 0;
};

接下来,我们定义一个已有的类 Adaptee,其中包含一个输出整数的函数 outputInteger()

class Adaptee {
public:
    void outputInteger() const {
        std::cout << "Output integer: " << 42 << std::endl;
    }
};

为了让 Adaptee 类能够与 Target 接口兼容,我们需要定义一个适配器类 Adapter,并继承自 Target 接口,同时包含一个指向 Adaptee 对象的指针:

class Adapter : public Target {
public:
    Adapter(const Adaptee* adaptee)
        : m_adaptee(adaptee) {
    }
    
    virtual void output() const override {
        m_adaptee->outputInteger();
    }

private:
    const Adaptee* m_adaptee;
};

在适配器的 output() 函数中,我们将调用 Adaptee 类的 outputInteger() 函数来实现输出整数的功能。

最后,我们可以通过如下代码来测试适配器模式的效果:

int main() {
    Adaptee adaptee;
    Target* target = new Adapter(&adaptee);

    target->output();

    delete target;
    return 0;
}

在这段测试代码中,我们首先创建了一个 Adaptee 类对象 adaptee,然后将其作为参数传递给了一个 Adapter 类对象 adapter,接着将 adapter 对象指针强制转换为 Target 接口指针,并通过该指针调用了 output() 函数。在运行时,output() 函数会调用 Adaptee 类的 outputInteger() 函数,最终输出整数 42。

总之,适配器模式可以帮助我们解决两个不兼容的接口之间的问题,提高代码的复用性和可维护性。在实际应用中,适配器模式经常被用于系统集成和接口转换等场景。

采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五百五。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值