适配器设计模式

一、适配器模式app

  • 把一个类的接口变换成客户端所期待的另外一种接口
  • 使本来因接口不匹配而没法在一块儿工做的两个类可以在一块儿工做
  • 分为类的适配器模式对象的适配器模式

二、类适配器模式对象

类的适配器模式把适配的类的API转换成为目标类的APIblog

  • 目标(Target)角色:所期待获得的接口。注意:因为这里讨论的是类适配器模式,所以目标不能够是类
  • 源(Adapee)角色:须要适配的接口
  • 适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不能够是接口,而必须是具体类

  • 客户端使用的时候,可使用Target 接口,接Adapter实例 

三、对象适配器模式继承

  • 对象的适配器模式把被适配的类的API转换成为目标类的API

与类的适配器模式不一样的是接口

  • 对象的适配器模式不是使用继承关系链接到Adaptee类,而是使用委派关系链接到Adaptee类

  • 提供一个包装(Wrapper)类Adapter
  • Adapter与Adaptee是委派关系,这决定了适配器模式是对象的

四、类适配器和对象适配器的权衡开发

(1)类适配器使用对象继承的方式,是静态的定义方式get

  • 对象适配器使用对象组合的方式,是动态组合的方式

(2)对于类适配器扩展

  • 因为适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一块儿工做
  • 由于继承是静态的关系,当适配器继承了Adaptee后,就不可能再去处理  Adaptee的子类了

对于对象适配器重构

  • 一个适配器能够把多种不一样的源适配到同一个目标
  • 换言之,同一个适配器能够把源类和它的子类都适配到目标接口
  • 由于对象适配器采用的是对象组合的关系,只要对象类型正确,是否是子类都无所谓

(3)对于类适配器引用

  • 适配器能够重定义Adaptee的部分行为,至关于子类覆盖父类的部分实现方法

对于对象适配器

  • 要重定义Adaptee的行为比较困难
  • 这种状况下,须要定义Adaptee的子类来实现重定义,而后让适配器组合子类
  • 虽然重定义Adaptee的行为比较困难,可是想要增长一些新的行为则方便的很,并且新增长的行为可同时适用于全部的源

(4)对于类适配器,仅仅引入了一个对象,并不须要额外的引用来间接获得Adaptee

对于对象适配器

  • 须要额外的引用来间接获得Adaptee
  • 建议尽可能使用对象适配器的实现方式,多用合成/聚合、少用继承
  • 固然,具体问题具体分析,根据须要来选用实现方式,最适合的才是最好的

五、适配器模式的优势

更好的复用性

  • 系统须要使用现有的类,而此类的接口不符合系统的须要
  • 那么经过适配器模式就可让这些功能获得更好的复用

更好的扩展性

  • 在实现适配器功能的时候,能够调用本身开发的功能,从而天然地扩展系统的功能

六、适配器模式的缺点

  • 过多的使用适配器,会让系统很是零乱,不易总体进行把握
  • 所以若是不是颇有必要,能够不使用适配器,而是直接对系统进行重构

七、缺省适配模式

  • 为一个接口提供缺省实现,这样子类型能够从这个缺省实现进行扩展,而没必要从原有接口进行扩展
  • 做为适配器模式的一个特例,缺省是适配模式在JAVA语言中有着特殊的应用

适配器模式的用意

  • 要改变源的接口,以便于目标接口相容

缺省适配的用意稍有不一样

  • 它是为了方便创建一个不平庸的适配器类而提供的一种平庸实现
  • 在任什么时候候,若是不许备实现一个接口的全部方法时,就可使用“缺省适配模式”制造一个抽象类,给出全部方法的平庸的具体实现
  • 这样,从这个抽象类再继承下去的子类就没必要实现全部的方法了
相关文章
相关标签/搜索