适配器Adapter[通俗易懂]

适配器Adapter[通俗易懂]适配器Adapter动机模式定义实例结构要点总结笔记动机在软件系统中,由于应用环境的变化,常常需要将”一些现存的对象”放在新的环境中应用.但是新的环境要求的接口是这些现存对象所不满足的.如何应对这种”迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?模式定义将一个类的接口转换为客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作实例//目标接口(新接口)class ITarget{public: vir

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

在软件系统中,由于应用环境的变化,常常需要将”一些现存的对象”放在新的环境中应用.但是新的环境要求的接口是这些现存对象所不满足的.

如何应对这种”迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?

模式定义

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

实例

//目标接口(新接口)
class ITarget{ 
   
public:
    virtual void process() = 0;
}

//遗留接口
class IAdaptee{ 
   
public:
    virtual void foo(int data) = 0;
    virtual int bar() = 0;
}
//遗留类
class OldClass : IAdaptee{ 
   
public:
public:
    void foo(int data){ 
   
        //..
    };
    int bar(){ 
   
        //..
    };
}
//对象适配器
class Adapter : public ITarget{ 
    //对象
protected:
    IAdaptee* pAdaptee; //组合
public:

    Adapter(IAdaptee *PAdaptee){ 
   
        this->pAdaptee = pAdaptee;
    }
    virtual void process(){ 
   
        int data = pAdaptee->bar();
        pAdatee->foo(data);
    }
}

//类适配器
class Adapter : public ITarget,protected OldClass//多继承,这样不好 因为类被写死了
{ 
   
}

int main(){ 
   
    IAdaptee* pAdaptee = new OldClass();

    ITarget *pTarget = new Adapter(pAdaptee);
    pTarget->process();
}


结构

在这里插入图片描述

要点总结

  • Adapter 模式主要是应用于”希望复用一些现存的类.但是接口与服用环境要求不一样的情况”,在遗留代码复用,类库迁移方面非常有用
  • GoF23定义了两种Adapter模式的实现接口:对象适配器和类适配器.但类适配器采用”多继承”的实现方式,一般不推荐使用,对象适配器采用”对象组合”的方式,更符合松耦合精神
  • Adapter模式可以实现的非常另外,不必拘泥于Gof23中定义的两种接口.例如,完全可以将Adapter模式中的”现存对象”作为新的接口方法参数,来达到适配器目的

笔记

  • 适配器得能适配 有内在实现层面的关联性 有内在功能的可复用性 ,可以把Adaptee转换为Itarget
  • stl中的queue内部使用的就是deque
  • Adapter就是把老接口转换成新接口
  • 很多时候设计模式不能和结构体一摸一样 要灵活使用
  • 不见得代码的设计和类图一一对应,设计模式对变换点 解决问题的手法 应用场景是否符合设计模式的定义 如果符合就是这个设计模式
  • 软件行业的FrameWork经常能看到有Adapter
  • 对象适配器就是组合对象
  • public继承是符合他的接口规范 protected和private继承是实现继承 用它的实现
  • 一般不使用类适配器 只使用 对象适配器
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168503.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C#窗体中的textBox怎么设置为密码框[通俗易懂]

    C#窗体中的textBox怎么设置为密码框[通俗易懂]场景在用C#做登录的窗体时,需要将TextBox设置为密码框。一般会找到TextBox然后设置其属性。但是属性里面没有直接的设置TextBox类型的属性。实现在行为–PasswordChar里面设置其为*,则自动将TextBox的类型修改为密码框。效果…

    2022年7月18日
    14
  • 【TCP/IP】IP地址分类和特殊IP地址

    【TCP/IP】IP地址分类和特殊IP地址IP地址是因特网技术中的一个非常重要的概念,IP地址在IP层实现了底层网络地址的统一,使因特网的网络层地址具有全局唯一性和一致性。IP地址含有位置信息,反映了主机的网络连接,使因特网进行寻址和路由选择的依据。 IP地址概述地址是标识对象所处位置的标识符。传输中的信息带有源地址和目的地址,分别标识通信的源结点和目的结点,即信源和信宿。目的地址是传输设备为信息进行寻址的依据。不同的物理…

    2022年4月29日
    69
  • 二叉树层次遍历算法——C/C++

    二叉树层次遍历算法——C/C++二叉树层序遍历1、算法思想用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。在进行层次遍历的时候,设置一个队列结构,遍历从二叉树的根节点开始,首先将根节点指针入队列,然后从队头取出一个元素,每取一个元素,执行下面两个操作:访问该元素所指向的节点若该元素所指节点的左右孩子节点非空,则将该元素所指节点的左孩子指针和右孩子指针顺序入队。此过程不断进行,当队列为空时,二叉树的层次遍历结束…

    2022年6月5日
    28
  • Unity 3D游戏开发学习教程

    Unity 3D游戏开发学习教程用C#用Unity3D制作游戏你会学到:您将学习3D游戏开发基础知识,以使用Unity3D引擎推进事物。到本课程结束时,他们将可以轻松制作任何类型的游戏,无论是3D还是2DMP4|视频:h264,1280×720|音频:AAC,44.1KHz,2Ch语言:英语+中英文字幕(根据原英文字幕机译更准确)|时长:87节课(11h32m)|大小解压后:5.86GB描述用Unity3D开发3D游戏《2021年》是一门结构完善的高级UnityC#课程,专为完全…

    2025年11月26日
    2
  • 《自然语言处理实战入门》 第三章 :中文分词原理及相关组件简介 —- 语言学与分词技术简介[通俗易懂]

    汉语,即汉族的语言,是中国通用语言,国际通用语言之一,属汉藏语系,汉语历史悠久,使用人数最多,世界上使用汉语的人数至少15亿,超过世界总人口的20%汉字最早起源于商朝的甲骨文,距今已经有3000-4000年的历史了。文字的目的是为了记录,古汉语以独字为核心,即使隋唐以后汉语书面语逐渐向口语化发展。

    2022年4月17日
    34
  • js 数组 复制「建议收藏」

    js 数组 复制「建议收藏」在js中,数组赋值是属于引用赋值,如:vara=[1,2,3]varb=a;若b修改,a也会做相应的改变,若要在b改变的时候保持a不变则需要深度复制b=JSON.parse(JSON.stringify(a))这样的话b在改变的话a就不会改变沈阳北站候车室南入口沈阳北站候车室南入口…

    2022年7月13日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号