首页 > 其他分享 >结构性模式 -- 适配器模式

结构性模式 -- 适配器模式

时间:2023-08-06 23:55:04浏览次数:30  
标签:-- Adapter 接口 class 对象 模式 new 适配器

Adapter(适配器) -- 类对象结构模式

意图

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。

别名

包装器(wrapper)

主要解决什么问题

主要解决在软件系统中,常常将一些"现存的对象"放到新的环境中,而新的环境是现对象不能满足的。

怎么解决

继承或者依赖(推荐)

关键代码

适配器继承或依赖已有的对象,实现想要的目标接口

适用性(或何时使用)

  • 想使用一个已经存在的类,但它的接口不符合你的需求
  • 想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作
  • (仅适用于对象Adapter),想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配它的父类接口。

优缺点

优点:

  • 1、可以让任何两个没有关联的类一起运行。
  • 2、提高了类的复用。
  • 3、增加了类的透明度。
  • 4、灵活性好。

缺点:

  • 过多地使用适配器,会让系统非常零乱,不易整体进行把握。

比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。


代码举例:
Adapter.h

#ifndef ADAPTER_H
#define ADAPTER_H
#include <iostream>


class Target
{
public:
    virtual void request() = 0;
};

class Adaptee
{
public:
    virtual void SpecailRequest() = 0;
};

class Adaptee1 : public Adaptee
{
public:
    void SpecailRequest()
    {
        std::cout << "Adaptee1" << std::endl;
    }
};

class Adaptee2 : public Adaptee
{
public:
    void SpecailRequest()
    {
        std::cout<< "Adapter2" << std::endl;
    }
};

class ClassAdapter : public Target, private Adaptee1
{
public:
    virtual void request()
    {
        std::cout << "ClassAdapter : " <<std::endl;
        SpecailRequest();
        std::cout<< std::endl;
    }
};

class ObjectAdapter : public Target
{
public:
    ObjectAdapter(Adaptee * adaptee) : adaptee_(adaptee){}

    virtual void request()
    {
        std::cout << "ObjectAdapter : " << std::endl;
        adaptee_->SpecailRequest();
        std::cout<< std::endl;
    }
private:
    Adaptee* adaptee_;
};

#endif

main.cpp

#include "Adapter.h"

int main()
{
    // class Adapter
    Target* class_adapter = new ClassAdapter();
    class_adapter->request();

    // Object Adapter
    Adaptee* adaptee1 = new Adaptee1();
    Target* object_adapter1 = new ObjectAdapter(adaptee1);
    object_adapter1->request();

    Adaptee* adaptee2 = new Adaptee2();
    Target* object_adapter2 = new ObjectAdapter(adaptee2);
    object_adapter2->request();

    return 0;
}

执行结果:
image

类适配器采用多重继承适配接口。类适配器的关键是用一个分支继承接口,而用另外一个分支继承接口的实现部分。通常C++中做出这一区分的方法是:用公共方式继承接口用私有继承的方式继承接口的实现

对象适配器采用对象组合的方式将具有不同组合的类组合在一起。

从上面的代码可以看出对象适配器代码相对麻烦一点,但它比较灵活。

标签:--,Adapter,接口,class,对象,模式,new,适配器
From: https://www.cnblogs.com/whiteBear/p/17610389.html

相关文章

  • Miller_Rabin 学习笔记
    费马小定理:对于任意一个质数满足:\(a^{p-1}\equiv1\pmodp\)二次探测:对于任意一个奇质数满足:\(x^2\equiv1\pmodp\)的解为\(x=1\)或\(x=p-1\)将两个定理结合起来,设\(p-1=u\times2^t\),那么计算出\(a^u\)次方后不断进行平方计算,如果某次平方后得到了1并且平方的数不为\(......
  • k8s 学习笔记之数据存储——基础存储
    在前面已经提到,容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。Volume是Pod中能够被多个容器访问的共享目录,它被定......
  • 【W的AC企划 - 第六期】树上分治
    往期浏览树上分治点分治讲解每次选取树的重心进行递归分治,中阶算法,大部分模板不需要理解,但是每一题都需要对维护函数进行修改。复杂度\(\mathcalO(N\logN)\)。个人封装由于需要进行一定程度的修改,不符合结构体封装的原则,故没有使用结构体。introot=0,MaxTree=1e1......
  • C#/.NET/.NET Core优秀项目和框架每周精选(坑已挖,欢迎大家踊跃提交PR或者Issues中留言)
    前言注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯......
  • scp tcpdump 多网卡绑定 永久修改网络相关配置文件
    scptcpdump多网卡绑定 永久修改网络相关配置文件网卡[root@localhost~]#vim/etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTO=static     //网卡获取地址模式ONBOOT=yes        //开机是否自启动​​IPADDR=192.168.91.105   ......
  • nacos系列:spring cloud使用nacos实现配置管理和服务发现
    目录版本说明创建项目版本说明IDEA:2021.3Maven:3.6.3Jdk:17Spring-Boot:2.6.13Spring-Cloud:2021.0.5Spring-Cloud-Alibaba:2021.0.5.0创建项目1、选择SpringInitalizr2、选择需要安装的版本和依赖3、修改pom文件<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns......
  • HTML5CSS3基础
    目录HTML5CSS3基础12D转换1.1二维坐标系1.22D转换之移动translate1.32D转换之旋转rotate1.42D转换中心点transform-origin1.52D转换之缩放scale1.62D转换综合写法1.72D转换总结2动画2.1动画的基本使用2.2动画常用属性2.3动画简写属性2.4速度曲线细节33D......
  • 玩一玩通义千问Qwen开源版,Win11 RTX3060本地安装记录!
    大概在两天前,阿里做了一件大事儿。   就是开源了一个低配版的通义千问模型--通义千问-7B-Chat。这应该是国内第一个大厂开源的大语言模型吧。虽然是低配版,但是在各类测试里面都非常能打。官方介绍:Qwen-7B是基于Transformer的大语言模型,在超大......
  • [CF364D] Ghd
    题目描述JohnDoeofferedhissisterJaneDoefindthegcdofsomesetofnumbers$a$.Gcdisapositiveinteger$g$,suchthatallnumberfromthesetareevenlydivisibleby$g$andthereisn'tsuch$g'$$(g'>g)$,thatallnum......
  • 12-Spring-Cloud-Security
    一、SpringSecurity认证和授权(一)安全性和SpringSecurity框架​1、从一个安全性应用场景说起​如下图所示,工单的生成需要使用用户的订单记录等数据,而这些数据保存在外部平台中;那么就需要用户将自己在订单管理平台上用户名和密码告诉工单系统,工单系统登录到订......