适配器模式
- 简介
在现实生活中有很多使用适配器模式的例子,比如:我们电脑需要的是5v的低电压,而生活用电是220V,所以要将200V转为5V才能使用,这就是电源适配器的作用了。通俗的理解就是,一个类的接口不满足客户端的需要,我们需要把它换成客户端需要的接口,使原本因接口不匹配而不能一起工作的两个类可以一起工作了。
适配器模式有类适配器模式和对象适配器模式两种。
- 类适配器模式
类适配器模式的静态结构图如下:
从上图中可以看出,Adaptee类没有sampleOperation2()方法,而客户端需要这个方法。为了使客户端能够使用Adaptee类,提供了一个中间环节Adapter把Target与Adaptee衔接起来,Adapter与Adaptee是继承关系,这决定这个适配器是类的。
涉及的角色:
1、目标(Target)角色:客户端所需要的接口。
2、源(Adaptee)角色:现有的接口,不满足客户端的需要。
3、适配器(Adapter)角色:适配器角色把源接口转换成目标接口。
目标接口代码:
1 public interface Target { 2 /** 3 * 源类中也有这个方法 4 */ 5 void sampleOpetation1(); 6 /** 7 * 源类中没有这个方法 8 */ 9 void sampleOpetation2(); 10 }
源接口代码:
1 public class Adaptee { 2 /** 3 * 源类中含有这个方法 4 */ 5 public void sampleOpetation1(){ 6 7 } 8 }
适配器代码:
1 public class Adapter extends Adaptee implements Target{ 2 @Override 3 public void sampleOpetation2() { 4 5 } 6 7 }
使用一个具体的类把源适配到目标对象中,由于适配器类是源的子类,因此可以在适配器类中置换掉源的一些方法。
- 对象适配器模式
与类适配器模式一样,对象适配器模式也是把被适配的类的API转换成目标类的API,但是是使用委派关系连接到Adaptee中去的。 对象适配器模式的静态结构图如下:
从上图中可以看出,客户端需要target,而源中没有sampleOperation2(),为了使客户端可以使用Adaptee,需要提供一个包装类,这个包装类包装了一个Adaptee实例,从而此包装类能够将Adaptee和Target衔接起来。
1、目标(Target)角色:客户端所需要的接口。
2、源(Adaptee)角色:现有的接口,不满足客户端的需要。
3、适配器(Adapter)角色:适配器角色把源接口转换成目标接口。
目标角色代码:
1 public interface Target { 2 /** 3 * 源类中也有这个方法 4 */ 5 void sampleOpetation1(); 6 /** 7 * 源类中没有这个方法 8 */ 9 void sampleOpetation2(); 10 }
源角色代码:
1 public class Adaptee { 2 /** 3 * 源类中含有这个方法 4 */ 5 public void sampleOpetation1(){ 6 7 } 8 }
适配器代码:
1 public class Adapter implements Target{ 2 3 private Adaptee adaptee; 4 5 public Adapter(Adaptee adaptee) { 6 super(); 7 this.adaptee = adaptee; 8 } 9 10 @Override 11 public void sampleOpetation2() { 12 13 } 14 15 @Override 16 public void sampleOpetation1() { 17 adaptee.sampleOpetation1(); 18 } 19 20 }
适配器模式的用意是将接口不同而功能相同或相近的两个接口加以转换,这里面适配器角色补充了一个源角色没有的方法。
- 使用适配器模式的场合
1、系统需要使用现有的类,而此类的接口不符合系统的需求。
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括将来可能引入的类一起工作。这些源类不一定要有很复杂的接口。
- 总结
适配器模式是一种结构模式,对于系统的改造,对于将已有的功能应用到新的需求上面有很大的帮助。