23种Java设计模式系列适配器模式定义模型以及应用场景详解
适配器模式无论是在生活中的场景还是框架的底层代码实现里都有大量的运用,属于结构型模式比较常用的,需要重点掌握@mikechen适配器模式的定义
适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配(转换)。
比如:美版和港版电脑的插头与国行不一样,所以我们需要更换电源适配器,或者增加一个转换插头来解决问题。
适配器模式的模型
适配器模式(Adapter)包含以下主要角色:
1.目标(Target)接口
当前系统业务所期待的接口,它可以是抽象类或接口。2.适配者(Adaptee)类
它是被访问和适配的现存组件库中的组件接口。3.适配器(Adapter)类
它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。适配器模式的实现
1.对象适配器1)创建目标接口package com.mikechen.java.design.adapter.model.objectadapter; /** * 目标接口 * * @author mikechen */ public interface Target { //源类有此方法 void sampleOperation1(); //源类无此方法 void sampleOperation2(); } 2)创建被适配的类package com.mikechen.java.design.adapter.model.objectadapter; /** * 被适配的类 * * @author mikechen */ public class Adaptee { //源类有此方法 public void sampleOperation1(){} } 3)创建适配器package com.mikechen.java.design.adapter.model.objectadapter; /** * 适配器 * * @author mikechen */ public class Adapter implements Target { //源 private Adaptee adaptee; public Adapter(Adaptee adaptee) { super(); this.adaptee = adaptee; } /** * 源类Adaptee有方法sampleOperation1 * 因此适配器类直接委派即可 */ @Override public void sampleOperation1() { adaptee.sampleOperation1(); } /** * 源类没有此方法 * 适配器类补充此方法 */ @Override public void sampleOperation2() { //重写方法 } } 2.类适配器1)创建目标接口package com.mikechen.java.design.adapter.model.classadapter; /** * 目标接口 * * @author mikechen */ public interface Target { //这是源类Adaptee也有的方法 void sampleOperation1(); //这是源类Adapteee没有的方法 void sampleOperation2(); } 2)创建被适配的类package com.mikechen.java.design.adapter.model.classadapter; /** * 被适配的类 * * @author mikechen */ public class Adaptee { public void sampleOperation1(){} } 3)创建适配器package com.mikechen.java.design.adapter.model.classadapter; /** * 适配器 * * @author mikechen */ public class Adapter extends Adaptee implements Target { /** * 源类没有方法sampleOperation2, * 因此适配器类补充上这个方法 */ @Override public void sampleOperation2() { //重写方法 } } 适配器模式的优缺
1.优点1)更好的复用性
系统需要使用现有的类,而此类的接口不符合系统的需要,那么通过适配器模式就可以让这些功能得到更好的复用。2)透明、简单
客户端可以调用同一接口,因而对客户端来说是透明的。3)更好的扩展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。4)解耦性
将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。5)符合开放-关闭原则
同一个适配器可以把适配者类和它的子类都适配到目标接口,可以为不同的目标接口实现不同的适配器,而不需要修改待适配类。2.缺点
过多的使用适配器,会让系统非常零乱,不易整体进行把握。适配器模式的应用场景
1.封装有缺陷的接口设计
假设我们依赖的外部系统在接口设计方面有缺陷(比如包含大量静态方法),引入之后会影响到我们自身代码的可测试性。
为了隔离设计上的缺陷,我们希望对外部系统提供的接口进行二次封装,抽象出更好的接口设计,这个时候就可以使用适配器模式了。2.统一多个类的接口设计
某个功能的实现依赖多个外部系统,通过适配器模式,将它们的接口适配为统一的接口定义,然后我们就可以使用多态的特性来复用代码逻辑。3.替换依赖的外部系统
把项目中依赖的一个外部系统替换为另一个外部系统的时候,利用适配器模式,可以减少对代码的改动。4.兼容老版本接口
在做版本升级的时候,对于一些要废弃的接口,不直接将其删除,而是暂时保留,并且标注为 deprecated,并将内部实现逻辑委托为新的接口实现。
这样做的好处是,让使用它的项目有个过渡期,而不是强制进行代码修改,这也可以粗略地看作适配器模式的一个应用场景。5.适配不同格式的数据
适配器模式主要用于接口的适配,实际上,它还可以用在不同格式的数据之间的适配。
比如,把不同格式的数据,统一为相同的格式, 也可以看作一种数据适配器,以方便存储和使用。
更多架构技术干货,私信【架构】即可查看我原创的300期+BAT架构技术系列文章与1000+大厂面试题答案合集。
最近爆火的sanag气传导蓝牙耳机上手快玩体验骨传导耳机相信大家并不陌生,很多人都在用,其有着良好的亲和力,大多数环境与空间中使用,都有着良好的佩戴体验,运动中又能兼顾周围突发的环境音,当然很多用骨传导耳机的人都深有体会的就是
华为回应与大众组建合资公司研发自动驾驶消息不属实澎湃新闻记者周玲10月20日,有媒体报道称,华为计划与全球汽车巨头大众集团组建合资公司,研发自动驾驶技术。对此,华为回应称,此消息不属实。有媒体援引消息人士的话报道称,华为和大众组
官方优化果然不同,一加9RT拿下原神测试榜双第一昨天公布的原神测试榜单显示,一加9RT以帧率抖动第一,发热最高温度控制第一,平均功耗第四的成绩领跑榜单。这代表什么意思呢?原神玩家都知道,目前想要达到完全不卡顿的效果几乎是不可能的
家里wifi信号差怎么办?家里的wifi为什么老是感觉网速慢?学会这几点让网速变快一大截。摆放位置要把路由器摆放在空旷的地方,比如客厅和主卧,尽量不要让wifi信号穿过太多墙壁和门,另外,金属物体放置在路由
新房装修好了,家里买个扫地机器人到底实不实用呢?新房子装修好了家里经济条件好当然可以购买一台扫地机器人实用。现在的扫地机器人比较多,你可以在网上搜索找一款性价比比较高的扫地机器人。这里本人推荐一款价格为2800元钱的科沃斯机器人
姚期智院士畅谈数字经济核心技术首次介绍数据定价算法18日,图灵奖获得者中国科学院院士清华大学交叉信息学院院长交叉信息核心技术研究院院长姚期智出席了由中央企业数字化发展研究院举办的数字化转型行动学习会议,并做了数字经济领域的核心科技
复古蓝牙音箱上手体验,它找到了时代和记忆的平衡科技因为情怀的注入,变得更有温度时光因为音乐的渗透,而显得韵味十足。这可能是很多影音厂商推出复古音箱的一个初衷吧,本期视频要跟大家分享这款漫步者M230的体验,一起来看看它是否能唤
你们的电脑都安装杀毒软件了吗?会有人攻击私人的电脑吗?我来回答一下这个问题,杀毒软件一般统称为安全软件,杀毒只是其其中一个重要功能,现在网络上的病毒软件相对已经没有以前那么多了,但是流氓软件越来越多,一不小心就被安装了全家桶,搞的一个
天猫精灵可以连接电脑吗?天猫精灵是马云研发的并且在7月5日推出,天猫精灵是把强大的人工智能,塞进了一个杯子大小的硬件。马云突然地进军硬件,让苹果三星也措手不及。这款机器人的背后是一个开放系统,因为它整合了
苹果x信号差怎么办?x的信号不好,我还真不知道,你要是说xr更不好我相信,其实整体来说,iPhone的信号确实差,没有诋毁的意思哦,实事求是而已。我都是站在客观的立场发言已已。苹果确实整个生态系统来说
长期带耳机会有什么影响?长期戴耳机的危害1。损害听力长期戴耳机会损害听力,这点并不难理解,当我们的外耳道口被耳机紧紧堵塞住,高音量的音频声会直接进入耳内而损伤听力,长期戴耳机会对我们的耳蜗造成持续冲击,形