设计模式——适配器模式


@Author:云都小生


概述



“适配器”在我们生活中很常见,像有些电器的工作电压是20V,但是家庭电压是220V,产生了不兼容的问题。但是由于有适配器这种东西,就能解决这个不兼容的问题。

在软件开发领域,我们也会碰到这样的问题,两个对象/类之间不兼容,可以引入一个“适配器”来协调这些不兼容的结构。适配器模式是一个结构型设计模式。

将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。


对象适配器



在对象适配器模式中,适配器与适配者之间是关联关系。

设计模式——适配器模式_第1张图片

在对象适配器模式中通常有以下角色:目标抽象类、适配器类和适配器者类。

目标抽象类:这个定义的是提供给用户使用的接口;

适配器类:适配器类就是一个转换器,将不兼容的接口转化成一个兼容的接口,这个类是适配器模式的核心;

适配者类:被适配的对象,也就是用户想要使用的方法。

对象适配器用得比较频繁,因为很多类被封装后,没有源代码了,所以在没有办法修改源代码的情况下,我们就需要使用对象适配器。


实例代码


//适配者类
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:云都小生

你可能感兴趣的:(设计模式)