详解适配器模式
“适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作”。
当然上面那个是教科书式的定义啦。你可以从下面这个例子这样理解,比较直观:
用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极、阴极外,还有一个地极。而有些地方的电源插座却只有两极,没有地极。电源插座与笔记本电脑的电源插头不匹配使得笔记本电脑无法使用。这时候一个三相到两相的转换器(适配器)就能解决此问题。
Java里面无非就是继承类、实现接口这些啦,就是通过它们来实现上面的机制。
两相电源插座是一个接口TwoPhase,里面有一个通电的方法plug2(),这在“适配器”模式中叫目标接口,就是说目标是让其他类“能插上两相的接口”,
三相电源插座也是一个接口ThreePhase,里面也有一个通电的方法plug3(),它有一个实现类,就是笔记本电脑类,叫NoteBook。
如何实现适配呢?有三种方法(其实是对应适配器模式的几种情况):
1,作一个类,叫三相到两相的转换器(适配器)类是ThreeGoTwoAdapter,同时实现两相电源插座接口TwoPhase和三相电源插座接口ThreePhase(其实就是提供plug2和plug3两个方法),然后就用NoteBook继承这个类就行了:
class NoteBook extends ThreeGoTwoAdapter
这样笔记本电脑也有plug2()方法了,表示能插上两相插头了,当然它用的是ThreeGoTwoAdapter的缺省实现,这种也叫“缺省适配器”模式。
2,让NoteBook直接实现三相电源插座接口ThreePhase,这就强制NoteBook提供plug2()方法,表示能插上两相插头,这种叫“类适配器”模式。
3,作一个三相电源笔记本类,ThreeAdapterNoteBook,让他实现ThreeAdaper接口,并持有NoteBook类对象的一个引用(术语叫做“委派”),让这个类对象构造时就把这个引用也传进去,也就是
1 class ThreeAdapterNoteBook implements ThreeAdapter{ 2 3 private NoteBook notebook; 4 5 public ThreeAdapterNoteBook(NoteBook nb){ 6 7 this.notebook=nb; 8 9 } 10 11 public void plug2() { this.nb.plug2(); } 12 13 public void plug3() { ....} 14 15 }