来点简单的,Adaptor 适配器模式

本文讨论了封装思想的运用,特别是适配器模式如何解决类接口不匹配的问题。通过实例解释了如何利用现有类并通过创建适配器类来实现与用户接口的兼容,同时强调了模式的应用不应受限于形式,而应关注其实质效果。
今天看了黑暗浪子的博客,喜欢他的博客,一看就是个爽快人。很高兴,一高兴,就想起来贴篇自己的文章以示高兴。

封装思想的又一种应用。类似挂羊头卖狗肉。比如一个类业已存在(类A),且正合我用,唯一遗憾是该类的方法名与用户要求的不同,那么用另一个新的、方法名符合规定的类套在类A身上是最顺其自然不过的方法了。新类的所作所为无非都是通过调用类A而实现。

在什么场合才需要挂羊头卖狗肉。第一,用户不关心是羊肉还是狗肉,只要是肉就行;第二,你手头没有羊肉而有现成狗肉。第三,用户需要羊头做为通行证。

这是类比,类比形象,但容易误导;所以贴出类比的原型,它是《DesignPatternsExplained》中的一个例子。这个例子是这样的,

有3个类,点、线、正方形。它们都有一个display方法。客户端不关心图形类型,只知道它们是图形,能画出自己来。所以,这里有一个抽象类,叫Shape,它有一个方法叫display. 原来的3个类都来继承Shape. 客户端只知道这个父类 (类比为肉),而不知什么点、线、方块。根据多态,此时Shape类可能是点的实例,也可能是线或正方形的实例,因此它所能画的图形类型也就这三种。如果此时多了一种需求,想让它也能画圆,那么就需要多写一个继承自Shape的Circle类负责画圆。摩拳擦掌准备再展弹指神功之际,突然发现有一个现成的类CircleA(狗肉)可以负起画圆的重任,且此类已经千锤百炼,已应用到好多模块中去了。现成的自然要拿来,问题是让此类直接继承Shape类是不可能的,一来CircleA的接口和Shape类要求继承实现的接口并不匹配,二来,重新修改Circle类会影响到其它已使用该类的模块。所以,在既想使用现成的类,又要匹配Shape的接口的情况下,自然就会创建一个新类,它对外继承了Shape接口(即,客户端要求的羊头,实际是一种契约,一种通行证),对内实际调用Circle类(狗肉,并无贬义)。这个新的类就是适配器。详细的图见下:

http://hiphotos.baidu.com/dapplehou/pic/item/640e7d1eb87dbdc51ad57600.jpg

适配器模式的实现,一般来说有两种方式;一种是用适配器对象包含另一个已经存在的对象,比如图中的Circle 包裹着 XXCircle;另一种方式是通过多继承的方式,比如Circle类可以不去调用XXCircle,而是继承XXCircle,同时再继承Shape(前提是Shape是个接口),既,Circle extends XXCircle implements Shape。它一样可以达到使用现成的类,却仍能匹配用户接口的目的(挂羊头卖狗肉)。

适配器模式也是一种封装,重点强调的接口转置,Façade模式也是一种封装,重点强调的是接口的简化。封装何其常见哉,比如我们写的类也会被别的模块调用,而我们写的类里一定使用了更通用的类,起码会用到基础类库,所以,我们的类一定也不知不觉的进行了封装工作,很可能我们的一个封装里既有对系统接口的简化,又有对部分已有接口的转置,那么这种封装该叫什么模式?所以说,不要拘泥于具体的招数,具体的模式皆是剑招,思想才是剑意。

就Adapter模式而言,你完全可以让这个Adapter除了做转置接口的工作外,再让它实现一些有助于解决实际问题的功能。这就如同练拳时野马分鬃右绷作捋,一开一合,潇洒无限,实战中难道因为我要遵守招式正统,而就不允许分鬃之余顺便吐他口痰么?不要为了模式而模式,约束了自己的创造力。
内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
06-17
### 适配器模式(Adapter Pattern)在软件开发中的应用 适配器模式是一种结构型设计模式,其核心目的是通过封装一个类或对象的接口,使其与另一个类或对象的期望接口相匹配[^4]。这种模式常用于解决现有类接口与客户端代码所需接口之间的不兼容问题。 在软件开发中,适配器模式通常分为两种类型:**类适配器**和**对象适配器**。 - **类适配器**通过继承实现,适配器类同时继承目标接口和被适配的类,并通过重写方法来调整接口行为。 - **对象适配器**通过组合实现,适配器类包含被适配类的实例,并通过委托调用其方法来调整接口行为。 #### 实现示例 以下是一个简单的对象适配器模式的实现示例,展示了如何将一个不符合目标接口的对象适配为目标接口: ```python # 目标接口 class Target: def request(self): return "Target: The default target behavior." # 需要适配的类 class Adaptee: def specific_request(self): return "Adaptee: The specific behavior." # 适配器类 class Adapter(Target): def __init__(self, adaptee): self.adaptee = adaptee def request(self): return f"Adapter: (TRANSLATED) {self.adaptee.specific_request()}" # 客户端代码 def client_code(target): print(target.request(), end="") # 使用适配器 adaptee = Adaptee() adapter = Adapter(adaptee) client_code(adapter) ``` 上述代码中,`Adapter` 类通过组合 `Adaptee` 实例,将其方法输出转换为符合 `Target` 接口的形式,从而实现了适配器模式[^4]。 #### OpenCascade 中的适配器模式 在 OpenCascade 技术库中,适配器模式被广泛应用于几何计算领域。例如,某些算法需要操作曲线对象,但它们并不直接接受 `Geom_Curve` 类型,而是接受 `Adaptor3d_Curve` 类型。这是因为 `Adaptor3d_Curve` 提供了一个统一的接口,可以适配多种类型的曲线对象(如几何曲线、拓扑边等),从而使算法更具通用性[^2]。 #### ArcGIS Web Adaptor适配器模式 ArcGIS Web Adaptor 是一个实际应用适配器模式的例子。它作为一个中间层,连接了 Web 应用程序和 ArcGIS Server。Web Adaptor 通过调整接口,使不同的前端框架能够与 ArcGIS Server 进行交互,而无需修改后端逻辑[^5]。 ### 总结 适配器模式的核心在于解决接口不兼容的问题,通过封装和转换,使得原本无法协同工作的类或对象能够顺利协作。无论是软件设计中的接口转换,还是具体技术框架中的应用(如 OpenCascade 和 ArcGIS Web Adaptor),适配器模式都展现了其强大的灵活性和实用性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值