适配器模式 -- Adapter

2017-03-24 19:32:46   最后更新: 2017-03-24 19:32:46   访问数量:323




上一篇日志中,我们介绍了结构型模式

结构型模式

本节就来介绍其中的适配器模式

 

适配器模式用于将一个类的接口转换成客户希望得到的另一个接口

适配器模式能够让本来不兼容的接口可以在一起工作

也称为“包装器”(Wrapper)模式

 

想象这样一种场景,我们拥有一个方法接受一个抽象的“打印机”对象,通过调用打印机的 print 方法实现打印

此时,他人为我们提供了一个 jar 包或者 RPC 接口,封装了一个“热敏打印机”对象,他拥有一个 sendMessage 方法,事实上,sendMessage 仅仅用于将需要打印的内容发送给远程的热敏打印机,从而实现打印功能

但是问题在于,我们的打印方法只能接受我们自己定义的“打印机”抽象类及他的子类,我们不能改变别人 jar 包或 RPC 接口给我们提供的类让他继承我们的“打印机”对象

那怎么才能让我们的方法兼容新的“热敏打印机”呢?有两种方案可供选择:

  1. 创建一个新的类,他同时继承自我们的“打印机”类和外部的“热敏打印机”类,然后在他内部通过实现“打印机”类的方法调用父类“热敏打印机”对应的方法就可以实现对象的兼容了
  2. 创建一个新的类,他继承自“打印机”类,同时让热敏打印机成为这个新对象的一个成员,这样我们可以通过在复写的方法中返回成员对应的操作即可

 

上面的两种方案分别对应于 Adapter 模式的类和对象版本,而新创建的类就是“适配器”类

 

类版本

 

 

对象版本

 

 

如上图所示,Adapter 模式由以下成员构成:

  • Target -- 为 client 使用而定义的类型
  • Adaptee -- 一个已存在的接口,也是需要被适配的接口
  • Adapter -- 对 Target 与 Adaptee 两个接口进行适配的适配器类

 

java 与 C++ 有一点很大的区别,就是 java 是不支持多重继承的,所以,除非 Target 与 Adaptee 至少有一个是接口,否则我们就不能够选择使用类版本的 Adapter 模式

对象 Adapter 模式看上去有着更大的灵活性,它允许我们有多个 Adaptee,但我们不能重定义任何 Adaptee 的方法实现

对象 Adapter 将不再兼容 Adaptee 的接口,如果需要双向适配器,最好的方式是使用类 Adapter 模式

 






技术帖      龙潭书斋      设计模式      模式      design pattern      adapter      adaptee      适配器      适配器模式     


京ICP备15018585号