设计模式之Adapter模式

Adapter模式

书中提到的Adapter模式,以使用AC适配器,使得额定功率12伏特的电脑在100伏特的交流电环境下工作这样的日常需求为例,阐述了实现Adapter模式的两种方法类适配器模式对象适配器模式

类适配器模式

类图

题外话

回忆起上一种设计模式中,作者曾在章末强调 请大家将“不要只使用具体类来编程,要优先使用抽象类和接口来编程”印在脑海中 于是前者的Iterator接口,在调用main方法时,也是优先将实例存入接口中,而非直接使用具体类来编程,从类图可以看出,在本章中也是如此

正文

可以很容易的看出,在案例中,Print接口象征的是额定功率为12伏特的电脑,Banner类象征的是实际情况:100伏特的交流电环境,而PrintBanner类则为AC适配器。当笔者看到这一步时,由于悟性有限并没有多大感悟,我仍然在思考其中妙处。于是我便不使用适配器模式来完成这项需求,即砍掉PrintBanner类,在对比中寻求突破。于是我发现了问题所在,由于用户最终要调用Print接口中的两个方法来实现需求,但目前实体类却已经确定了,就是要用Banner中的showWithAster和showWithParen来实现需求,那么要想使用Print接口中的方法来完成showWithAster和showWithParen一样的效果,只有两种途径

  • 其一:实现Print接口,将方法重写为一模一样的需求,那么问题也很明显了,非常的浪费精力

  • 其二:实现Print接口,在实现类中调用Banner方法,这似乎就是类适配器模式本身

接下来谈谈我的看法,到这之后笔者似乎发现一个点,那就是适配器模式本身的应用场景似乎在于处理一些强制性问题,比方说某种不一致,是纯粹的一种解决问题的方案,在多人开发或者是使用他人写的方法上可能会经常用到这点,如果是个人开发,当遇到需要使用适配器模式来解决问题时,似乎更多意味着程序设计阶段本身的设计失误。

对象适配器模式

类图

同样是处理不适配问题,但对象适配器的使用场景与类适配的使用场景有所不同,区别主要在于用户最终调用的是接口还是类,由于核心理论已理清,于是题主在这就只点一下原理来保证文章完整度。由于Java中规定,一个子类只能同时继承一个父类,所以该设计模式中,无法与类适配中一样,让PrintBanner先继承Banner类再实现Print接口,只能选择折中的方案,即让PrintBanner继承Print类再创建出Banner类实例,调用Banner类的方法,其中原理和类适配器完全相同。在这我又在思考一个问题,既然如此,是不是也可以先继承Banner类在创建Print实例呢,答案是否定的,因为最终的需求是调用Print类,而如果PrintBanner类继承的是Banner类,则无法将PrintBanner的实例赋值给Print对象。

以下为不带案例的类图

类适配器模式
对象适配器模式