适配器模式
适配器模式将一个类的接口转换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能在一起工作。适配器在生活中还是很常见的,比如说咱们的手机充电器一般是两个脚的,但是咱们只有三个插孔的插线板,如果想要通过这个插线板给手机充电的话就需要一个转换器能够连接插线板和手机充电器,而这个转换器就是一个适配器。
从上面的例子中,我们可以抽象出适配器模式涉及到的角色主要有以下三个:
Target目标角色(两个引脚的手机充电器):该角色定义其他类转换为何种接口,也就是我们期望的接口。
被适配角色Adaptee(三个插孔的插线板):它是一个已经存在的,运行良好的类或者对象,经过适配器角色的包装,它会成为一个崭新的角色。
Adapter适配器角色(转换器):适配器模式的核心角色,其他两个角色都是已经存在的角色,其职责非常简单,将被适配角色转换为目标角色。
先看一个简单的实现:
public class Test {
public static void main(String[] args) {
Target target = new ConcreateTarget();
target.request();
target = new Adapter();
target.request();
}
}
interface Target {
void request();
}
class ConcreateTarget implements Target {
public void request() {
System.out.println("concreateTarget request");
}
}
class Adaptee {
public void myRequest() {
System.out.println("adaptee request");
}
}
class Adapter extends Adaptee implements Target {
public void request() {
myRequest();
}
}
其类图结构如下:
在上述代码中,我们声明Target接口,实现了被适配对象Adaptee,通过继承Adaptee并实现Target接口的方式实现了适配器Adapter,然后就可以按照原始的掉用Target的对象方法一样调用Adaptee中的方法,达到适配的目的。更一般的,适配器模式的类图结构如下:
适配器模式的优点
1. 可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定他们就成;
2.增加类的透明性,提高了类的复用度;
3.灵活性好,如果不需要适配器了,直接删除即可。
适配器使用场景
在扩展系统时,需要使用一个已有或者新建立的类,但这个类又不符合系统的接口,此时可以考虑使用适配器。