p2p网站 开发,广告设计与制作专业主要学什么,淮北论坛最新招聘信息,企业做网站公司排名口碑在软件开发中#xff0c;我们经常会遇到这样的情况#xff1a;我们需要使用一个现有的类或者接口#xff0c;但它与我们系统的目标接口不兼容#xff0c;而我们又不能修改它。这时候#xff0c;我们该怎么办呢#xff1f;大多数情况下我们都可以使用适配器模式来解决这个…在软件开发中我们经常会遇到这样的情况我们需要使用一个现有的类或者接口但它与我们系统的目标接口不兼容而我们又不能修改它。这时候我们该怎么办呢大多数情况下我们都可以使用适配器模式来解决这个问题本文将从以下四个方面讲解适配器模式。 简介  优缺点  应用场景  Java 代码示例  
简介 
适配器模式Adapter Pattern是一种结构型设计模式它可以将一个接口转换成客户端所期待的另一个接口从而使原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式也称为包装器模式Wrapper Pattern因为它通过一个包装类即适配器来包装不兼容的接口并提供统一的目标接口。适配器模式可以在运行时根据需要选择不同的适配器来适配不同的被适配者。 对象适配器模式的各角色定义如下。 Target目标接口客户端要使用的目标接口标准对应下文中的三相插孔接口 TriplePin。  Adapter适配器实现了目标接口负责适配转换被适配者的接口 specificRequest()为目标接口 request()对应本章下文中的电视机专属适配器类 TriplePinAdapter。  Adaptee被适配者被适配者的接口标准目前不能兼容目标接口的问题接口可以有多种实现类对应下文中的两相插孔接口 DualPin。  Client客户端目标接口的使用者。  推荐博主开源的 H5 商城项目waynboot-mall这是一套全部开源的微商城项目包含三个项目运营后台、H5 商城前台和服务端接口。实现了商城所需的首页展示、商品分类、商品详情、商品 sku、分词搜索、购物车、结算下单、支付宝/微信支付、收单评论以及完善的后台管理等一系列功能。 技术上基于最新得 Springboot3.0、jdk17整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中间件。分模块设计、简洁易维护欢迎大家点个 star、关注博主。 github 地址https://github.com/wayn111/waynboot-mall 优缺点 
适配器模式的优点有 适配器模式可以增强程序的可扩展性通过使用适配器可以在不修改原有代码的基础上引入新的功能或者接口。  适配器模式可以提高类的复用性通过使用适配器可以将已有的类或者接口重新组合和封装使其符合新的需求。  适配器模式可以增加类的透明度通过使用适配器客户端只需要关注目标接口而无需了解被适配者的具体实现。  适配器模式可以灵活地切换不同的被适配者通过使用不同的适配器可以动态地选择不同的被适配者来满足不同的场景。  
适配器模式的缺点有 适配器模式会增加系统的复杂性过多地使用适配器会使系统变得零乱和难以理解。  适配器模式可能会降低系统的性能因为每次调用目标接口时都需要经过适配器的转换。  适配器模式可能会违反开闭原则如果目标接口发生变化则需要修改所有的适配器类。  
应用场景 
适配器模式适用于以下场景 当需要在一个已有系统中引入新的功能或者接口时它与系统的目标接口不兼容但又不能修改原有代码时可以使用适配器模式。例如在一个数据库操作系统中如果想要支持多种类型的数据库源但系统只提供了一个固定类型数据库源的操作接口时可以使用一个数据库源操作适配器来将不同类型数据库源转换成统一类型数据库源。  当需要在多个独立开发的系统或者组件之间进行协作时但由于各自采用了不同的接口或者协议时可以使用适配器模式。例如在一个分布式服务系统中如果想要让不同语言编写的服务之间进行通信和调用但各自采用了不同的通信协议和数据格式时可以使用一个服务通信适配器来将不同协议和数据格式转换成统一协议和数据格式。  
Java 代码示例 
举一个生活中常见的实例我们新买了一台电视机其电源插头是两相的不巧的是墙上的插孔却是三相的这时电视机便无法通电使用我们以代码来重现这个场景。 定义目标接口三相插口 TriplePin其中 3 个参数 l、n、e 分别对应火线(live)、零线(null)和地线(earth)。  
public interface TriplePin {public void electrify(int l, int n, int e);
}定义被适配者接口两项插口 DualPin可以看到参数中缺少了地线 e 参数。  
public interface DualPin {public void electrify(int l, int n);
} 添加被适配者接口具体实现类TV可以看到 TV 实现的是两相接口所在无法直接在三项接口中使用。  
public class TV implements DualPin {Overridepublic void electrify(int l, int n) {System.out.println(火线通电:  l  零线通电:  n);System.out.println(电视开机);}
} 定义适配器类三项接口适配器 TriplePinAdapter实现了三项接口并且包含两项接口属性在 electrify 方法中调用被适配设备的两插通电方法忽略地线参数 e以此来完成三项接口对两项接口的兼容。  
这也就意味着 TriplePinAdapter 类能帮助我们将 TV 类与三项接口兼容。 
public class TriplePinAdapter implements TriplePin {private DualPin dualPin;public TriplePinAdapter(DualPin dualPin) {this.dualPin  dualPin;}Overridepublic void electrify(int l, int n, int e) {// 调用被适配设备的两插通电方法忽略地线参数edualPin.electrify(l, n);}
}定义客户端类  
public class Client {public static void main(String[] args) {DualPin dualPinDevice  new TV();TriplePin triplePinDevice  new TriplePinAdapter(dualPinDevice);triplePinDevice.electrify(1, 0, -1);}
}输出结果如下 
火线通电:1零线通电:0
电视开机总结 通过利用适配器模式对系统进行扩展后我们就不必再为解决兼容性问题去暴力修改类接口了转而通过适配器以更为优雅、巧妙的方式将两侧“对立”的接口“整合”在一起顺利化解双方难以调和的矛盾最终使它们顺利接通。 关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、国外优质文章翻译等您的关注将是我的更新动力