原创做品,能够转载,可是请标注出处地址http://www.cnblogs.com/V1haoge/p/6479118.htmlhtml
适配器就是一种适配中间件,它存在于不匹配的两者之间,用于链接两者,将不匹配变得匹配,简单点理解就是日常所见的转接头,转换器之类的存在。设计模式
适配器模式有两种:类适配器、对象适配器、接口适配器ide
前两者在实现上有些许区别,做用同样,第三个接口适配器差异较大。测试
一、类适配器模式:this
原理:经过继承来实现适配器功能。spa
当咱们要访问的接口A中没有咱们想要的方法 ,却在另外一个接口B中发现了合适的方法,咱们又不能改变访问接口A,在这种状况下,咱们能够定义一个适配器p来进行中转,这个适配器p要实现咱们访问的接口A,这样咱们就能继续访问当前接口A中的方法(虽然它目前不是咱们的菜),而后再继承接口B的实现类BB,这样咱们能够在适配器P中访问接口B的方法了,这时咱们在适配器P中的接口A方法中直接引用BB中的合适方法,这样就完成了一个简单的类适配器。设计
详见下方实例:咱们以ps2与usb的转接为例代理
ps2接口:Ps2code
1 public interface Ps2 { 2 void isPs2(); 3 }
USB接口:Usbhtm
1 public interface Usb { 2 void isUsb(); 3 }
USB接口实现类:Usber
1 public class Usber implements Usb { 2 3 @Override 4 public void isUsb() { 5 System.out.println("USB口"); 6 } 7 8 }
适配器:Adapter
1 public class Adapter extends Usber implements Ps2 { 2 3 @Override 4 public void isPs2() { 5 isUsb(); 6 } 7 8 }
测试方法:Clienter
1 public class Clienter { 2 3 public static void main(String[] args) { 4 Ps2 p = new Adapter(); 5 p.isPs2(); 6 } 7 8 }
显示结果:
USB口
实例讲解:
我手中有个ps2插头的设备,可是主机上只有usb插头的插口,怎么办呢?弄个转换器,将ps2插头转换成为USB插头就可使用了。
接口Ps2:描述ps2接口格式
接口Usb:描述USB接口格式
类Usber:是接口Usb的实现类,是具体的USB接口格式
Adapter:用于将ps2接口格式转换成为USB接口格式
二、对象适配器模式
原理:经过组合来实现适配器功能。
当咱们要访问的接口A中没有咱们想要的方法 ,却在另外一个接口B中发现了合适的方法,咱们又不能改变访问接口A,在这种状况下,咱们能够定义一个适配器p来进行中转,这个适配器p要实现咱们访问的接口A,这样咱们就能继续访问当前接口A中的方法(虽然它目前不是咱们的菜),而后在适配器P中定义私有变量C(对象)(B接口指向变量名),再定义一个带参数的构造器用来为对象C赋值,再在A接口的方法实现中使用对象C调用其来源于B接口的方法。
详见下方实例:咱们仍然以ps2与usb的转接为例
ps2接口:Ps2
1 public interface Ps2 { 2 void isPs2(); 3 }
USB接口:Usb
1 public interface Usb { 2 void isUsb(); 3 }
USB接口实现类:Usber
1 public class Usber implements Usb { 2 3 @Override 4 public void isUsb() { 5 System.out.println("USB口"); 6 } 7 8 }
适配器:Adapter
1 public class Adapter implements Ps2 { 2 3 private Usb usb; 4 public Adapter(Usb usb){ 5 this.usb = usb; 6 } 7 @Override 8 public void isPs2() { 9 usb.isUsb(); 10 } 11 12 }
测试类:Clienter
1 public class Clienter { 2 3 public static void main(String[] args) { 4 Ps2 p = new Adapter(new Usber()); 5 p.isPs2(); 6 } 7 8 }
结果显示:
USB口
实例讲解:
我手中有个ps2插头的设备,可是主机上只有usb插头的插口,怎么办呢?弄个转换器,将ps2插头转换成为USB插头就可使用了。
接口Ps2:描述ps2接口格式
接口Usb:描述USB接口格式
类Usber:是接口Usb的实现类,是具体的USB接口格式
Adapter:用于将ps2接口格式转换成为USB接口格式
三、接口适配器模式
原理:经过抽象类来实现适配,这种适配稍别于上面所述的适配。
当存在这样一个接口,其中定义了N多的方法,而咱们如今却只想使用其中的一个到几个方法,若是咱们直接实现接口,那么咱们要对全部的方法进行实现,哪怕咱们仅仅是对不须要的方法进行置空(只写一对大括号,不作具体方法实现)也会致使这个类变得臃肿,调用也不方便,这时咱们可使用一个抽象类做为中间件,即适配器,用这个抽象类实现接口,而在抽象类中全部的方法都进行置空,那么咱们在建立抽象类的继承类,并且重写咱们须要使用的那几个方法便可。
目标接口:A
1 public interface A { 2 void a(); 3 void b(); 4 void c(); 5 void d(); 6 void e(); 7 void f(); 8 }
适配器:Adapter
1 public abstract class Adapter implements A { 2 public void a(){} 3 public void b(){} 4 public void c(){} 5 public void d(){} 6 public void e(){} 7 public void f(){} 8 }
实现类:Ashili
1 public class Ashili extends Adapter { 2 public void a(){ 3 System.out.println("实现A方法被调用"); 4 } 5 public void d(){ 6 System.out.println("实现d方法被调用"); 7 } 8 }
测试类:Clienter
1 public class Clienter { 2 3 public static void main(String[] args) { 4 A a = new Ashili(); 5 a.a(); 6 a.d(); 7 } 8 9 }
四、适配器模式应用场景
类适配器与对象适配器的使用场景一致,仅仅是实现手段稍有区别,两者主要用于以下场景:
(1)想要使用一个已经存在的类,可是它却不符合现有的接口规范,致使没法直接去访问,这时建立一个适配器就能间接去访问这个类中的方法。
(2)咱们有一个类,想将其设计为可重用的类(可被多处访问),咱们能够建立适配器来将这个类来适配其余没有提供合适接口的类。
以上两个场景其实就是从两个角度来描述一类问题,那就是要访问的方法不在合适的接口里,一个从接口出发(被访问),一个从访问出发(主动访问)。
接口适配器使用场景:
(1)想要使用接口中的某个或某些方法,可是接口中有太多方法,咱们要使用时必须实现接口并实现其中的全部方法,可使用抽象类来实现接口,并不对方法进行实现(仅置空),而后咱们再继承这个抽象类来经过重写想用的方法的方式来实现。这个抽象类就是适配器。
同系列文章: