@Author:云都小生
概述
“适配器”在我们生活中很常见,像有些电器的工作电压是20V,但是家庭电压是220V,产生了不兼容的问题。但是由于有适配器这种东西,就能解决这个不兼容的问题。
在软件开发领域,我们也会碰到这样的问题,两个对象/类之间不兼容,可以引入一个“适配器”来协调这些不兼容的结构。适配器模式是一个结构型设计模式。
将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。
对象适配器
在对象适配器模式中,适配器与适配者之间是关联关系。
在对象适配器模式中通常有以下角色:目标抽象类、适配器类和适配器者类。
目标抽象类:这个定义的是提供给用户使用的接口;
适配器类:适配器类就是一个转换器,将不兼容的接口转化成一个兼容的接口,这个类是适配器模式的核心;
适配者类:被适配的对象,也就是用户想要使用的方法。
对象适配器用得比较频繁,因为很多类被封装后,没有源代码了,所以在没有办法修改源代码的情况下,我们就需要使用对象适配器。
实例代码
//适配者类
public class Jack220V {
public void connection()
{
System.out.println("你已经连接了一个220V的插口");
}
}
//面向用户的插口(用户期盼看到的)
public class JackUser {
public void connection() {
System.out.println("你已经连接了一个220V的插口");
}
}
//适配器类
class Adapter extends JackUser {
private Jack220V jack220v = new Jack220V(); //维持一个对适配者对象的引用
public void connection() {
System.out.println("你通过适配器连接了一个220V的插头");
jack220v.connection(); //转发调用
}
}
//客户端类
public class Client {
public static void main(String[] args) {
JackUser jack = new Adapter();
jack.connection();
}
}
我们向用户提供了一个插口,这个插口可以连接220V的电路,但是我们是通过适配器来进行转化的。
类适配器
在现实案例中,类适配器会比较少用。对象适配器用得频繁,类适配器的使用受到很多限制。
对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系。
interface Target {
public void request();
}
public class Adaptee {
public void specificRequest()
{
System.out.println("我是一个普通的适配器类");
}
}
class Adapter extends Adaptee implements Target {
public void request() {
super.specificRequest();
}
}
public class Client {
public static void main(String[] args) {
Target adapter = new Adapter();
adapter.request();
}
}
再说一次!对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系。
缺省适配器模式
现在有这么一种情况,我们需要实现一个接口,但是不需要实现一个接口里的所有方法,我们应该怎么做?
可以选择这样,我们先用一个抽象类实现该接口。这样一来,我们的适配器可以直接继承这个适配器类。接口的方法必须全部覆盖,但是由于有抽象类把这些方法定义成了空方法,我们只需要选择性的覆盖即可。
在缺省适配器模式中,通常包含如下三个角色:适配者接口、缺省适配器类、具体业务类。
适配者接口声明了大量的方法。
缺省适配器类是缺省适配器模式的核心,实现适配者接口,它通常是抽象的,可以使用空方法来定义适配者类的方法。
具体业务类是缺省适配器的子类,直接继承适配器类,可以有选择地对适配器类中定义的方法进行覆盖。
优缺点
优点:由于有了适配器,我们不用去修改原有的结构,就像有了一个适配器,我们就不用调整电压啦。
可扩展性也很强,在不修改源代码的基础上,我们又能增加一些新的适配器类。
缺点:有一些编程语言不支持多重继承,不能同时适配多个适配者。其次,有些情况下,适配者模式的实现过程会比较麻烦、复杂一些。
2017/10/25 22:41:05 @Author:云都小生