当前位置 博文首页 > JavaEdge全是干货的技术号:【Java设计模式系列】适配器模式及适
一般客户端通过目标类的接口访问它所提供的服务。
有时,现有类可以满足客户端类的需要,但所提供接口不一定是客户端所期望的,可能因为现有类中方法名与目标类中定义的方法名不一致。
这时,现有接口需要转化为客户端的期望接口,保证复用现有类。若不进行这样转化,客户端就不能利用现有类所提供功能,适配器模式就可以完成这样的转化。
在适配器模式中可以定义一个包装类,包装不兼容接口的对象
适配器提供客户类需要的接口。
适配器的实现就是把客户端的请求转化为对适配者的相应接口的调用。即当客户类调用适配器方法时,在适配器类的内部将调用适配者类的方法,而该过程对客户类透明,客户类并不直接访问适配者类。
因此,适配器可以使由于接口不兼容而不能交互的类可以一起协作。
将一个接口转换成客户端希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器。
既可以作为类结构型模式,也可以作为对象结构型模式。
适配器模式有对象适配器和类适配器两种实现:
默认情况下,AudioPlayer 可以播放 mp3
我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建
使用
AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo,我们的演示类使用 AudioPlayer 类来播放各种格式。
创建接口。
测试类输出:
Iterable
的 Fibnoacci
生成器重写这个类,实现 Iterable
接口?
因此另一种选择,创建一个 适配器(Adapter) 来实现所需接口。有多种适配器的实现,例如继承:
在 for-in 语句中使用 IterableFibonacci
,必须在构造函数中提供一个边界值,这样 hasNext()
才知道何时返回 false,结束循环。
类适配器模式还具有如下优点:
由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
对象适配器模式还具有如下优点:
一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
对于Java不支持多继承,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。
与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。
在以下情况下可以使用适配器模式:
Sun公司在1996年公开了Java语言的数据库连接工具JDBC,JDBC使得Java语言程序能够与数据库连接,并使用SQL语言来查询和操作数据。JDBC给出一个客户端通用的抽象接口,每一个具体数据库引擎(如SQL Server、Oracle、MySQL等)的JDBC驱动软件都是一个介于JDBC接口和数据库引擎接口之间的适配器软件。抽象的JDBC接口和各个数据库引擎API之间都需要相应的适配器软件,这就是为各个不同数据库引擎准备的驱动程序。
认适配器模式(Default Adapter Pattern)或缺省适配器模式
当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求,它适用于一个接口不想使用其所有的方法的情况。因此也称为单接口适配器模式。