设计模式 之 Adapter

本文探讨了在开发在线电子白板软件时,如何通过适配器模式解决功能可复用但接口不匹配的问题。通过将成熟的文本绘制工具包中的TextView对象与自定义的TextShape对象进行协调,实现文本功能的高效复用,同时保持代码的清晰与稳定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简述

       模式 Adapter(适配器)又称为 Wrapper(包装器),它的提出是为了协调那些功能可复用但接口格式不相称的代码场景。

 

第一个场景

       假设需要开发一款在线的电子白板软件,电子白板软件需要能够绘制各种图像及编辑文本。绘制功能对应的主要抽象是一组图像对象,如直线(LineShape)、矩形(RectangleShape)、 椭圆(OvalShape)、文本(TextShape)……,每个图像对象兼具图像算法和图像绘制职责。

       基础几何图像对象(如直线、矩形)是很容易实现的,但文本对象就比较复杂了,其中涉及到了文字格式、段落格式、屏幕更新、缓存管理等诸多内容。如果此时正好有一个成熟的文本绘制工具包可供使用,这个工具包中的TextView对象提供了完整的文本格式、段落、屏幕及缓存管理,实现了TextShape对象需要实现的一些职责。

       是否可复用呢?如何复用?

  • 从TextView中硬拷贝代码显然是不可取的,先不说代码重复的问题,TextShape对象的实现本身会依赖同包中的其它代码,而这些代码又不全是对外权限公开的,如果把所依赖的私有代码再硬拷贝过来,那么所依赖的私有代码还会再依赖另外的私有代码,一生二,二生三,三生万物……这将是一场灾难。
  • 如果在工具包中直接修改TextView的代码就不会有权限问题了。但这种将上层逻辑移至底层依赖的做法是极其不推荐的。造成的结果是电子白板代码混乱、工具包代码混乱,而且对工具包中代码的直接修改很有可能引起工具包代码的本身不稳定。如果工具包的发布者提供了重要的版本升级,升级的内容也很难被引入到电子白板中。
  • 将TextView对象引入到TextShape中,在TextShape中酌情变通使用是可行的。这样做的问题在于TextShape中难免会出现一组为协调TextView和TextShape差异所写的代码,这样的代码会使TextView变形。
       既然这样,我们可以定义一个TextApapter对象,它负责TextView和TextShape之间的差异协调。TextShape用TextAdapter(继承或组合),TextAdapter用TextView(继承或组合)。关系如下图:
       这种结构,实际上就是Adapter模式。当然,如果TextAdapter本身需要做的事情很少,也可以直接用TextShape兼职Adaper。 
 

结构

一、类适配器 && 对象适配器

       上例中通过继承实现Adaper模型(TextShape继承TextAdapter,TextAdapter继承TextView),也可以通过组合的方式实现。这两种方式也被称为Class Adapter(类适配器)Object Adapter(对象适配器)。以下用类图描述这两种结构:

   1. 类适配器

   2. 对象适配器

 

        不同于类适配器,对象适配器使用的是组合的方式代替了继承(Adapter有指向Adaptee的引用,而不是Adapter继承Adaptee)。

 

二、类适配器 Vs. 对象适配器

   1. 类适配器
  • 因为Adapter是Adaptee的子类,所以,对于类似Java这样不支持多重继承的语言,类适配器无法做到适配多Adaptee。
  • Adapter不需要引入指向Adaptee的引用/指针。
  • 作为Adaptee的子类,Adapter自动从Adaptee继承属性和方法,不需要显示调用。
  • Adapter可从Adaptee继承权限为public和protected的的属性及方法,而对象适配器仅能使用public元素。
  • Adapter客Override Adaptee的方法。
   2. 对象适配器
  • 因为不需要继承,而是Adapter持有Adaptee的引用,所以一个Adapter可以适配多个Adaptee。
  • Adapter需要显示调用Adaptee的方法。
  • 仅能使用Adaptee的public方法(假设两者不同包)。
  • 不支持Override。

 

成员

  • Client:  所处的代码环境(在线电子白板)。
  • Target: 满足Client使用要求的功能接口/类(TextShape)。
  • Adaptee:已有的功能匹配但接口形式不匹配的类(TextView)。
  • Adapter:Adaptee和Target的协调者(TextAdatper)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值