适配器模式—结构型

结构型简介

结构型模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题。结构型模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式。

简介

适配器模式(Adapter Design Pattern),这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不匹配而不能一起工作的类能够在一起工作。

使用场景

1,想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能将来要引进的类一起工作;

2,系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容;

3,需要一个统一的输出接口,而输入端的类型不确定;

4,替换依赖的外部系统

5,兼容老版本接口

6,封装有缺陷的接口设计

分类

适配器模式主要有两种:一是,类适配器模式;二是,对象适配器模式;其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。

类适配器

UML图

适配器模式—结构型_第1张图片

Target:目标,也就是我们想要得到的接口;注意,这里是类适配器模式,所以目标不可以是类;

Adaptee:需要似乎配的接口

Adapter:适配器角色,也是此模式的核心;适配器把源接口转换成目标接口。所以这个角色不可以是接口,而是具体类;

示例:

手机充电器想必大家都用过,就是把220V转换位5V或者9V;其中5V或9V电压就是Target接口,220V电压就是Adaptee类,而把220V转换位5V或9V就是Adapter;代码如下:

Target角色

public interface FiveOrNineVolt {
    int getFiveVolt();

    int getNineVolt();
}

Adaptee角色,需要被转换的对象 

public class Volt220 {

    public int getVolt220() {
        return 220;
    }
}

Adapter角色,220V适配为5V或9V

public class VoltAdapter extends Volt220 implements FiveOrNineVolt {
    @Override
    public int getFiveVolt() {
        return 5;
    }

    @Override
    public int getNineVolt() {
        return 9 ;
    }
}

对象适配器

和类适配器异议,对象适配器也是把被适配的类的Api转换为目标类的Api,与类适配器不用的是,对象适配器不是使用继承连接到Adaptee类,而是使用代理关系连接到Adaptee类;

UML图

适配器模式—结构型_第2张图片

示例

还是以上面电源适配为例,从UML图中看出,Adaptee类(Volt220)中并没有getVolt5()和getVolt9()这两个方法,而客户端需要这个方法。为了是客户端能够使用Adaptee类,需要提供一个包装类Adapter。而这个包装类包装了一个Adaptee的实例,从而使此包装类能够把Adaptee的Api与Target类的Api衔接起来;

示例代码:

 

Target角色

public interface FiveOrNineVolt {
    int getFiveVolt();

    int getNineVolt();
}

Adaptee角色,需要被转换的角色

public class Volt220 {

    public int getVolt220() {
        return 220;
    }
}

Adapter适配器角色

public class VoltAdatper2 implements FiveOrNineVolt {
    private Volt220 volt220;

    public VoltAdatper2(Volt220 volt220) {
        this.volt220 = volt220;
    }

    @Override
    public int getFiveVolt() {
        return 0;
    }

    @Override
    public int getNineVolt() {
        return 0;
    }
}

对象适配直接将被适配对象传递到Adapter中,使用组合的形式实现接口兼容的效果。比类适配器方式更为灵活,他的一个好处就是被适配对象中的方法不会爆露出来,而类适配方式由于继承了被适配对象,因此,被适配对象类的函数在Adapter类中也都含有;对象适配模式从这点来说更加灵活,使用;

两者如何选择:

1,如果 Adaptee 接口并不多,那两种实现方式都可以。

2,如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定义大部分都相同,那我们推荐使用类适配器,因为 Adaptor 复用父类 Adaptee 的接口,比起对象适配器的实现方式,Adaptor 的代码量要少一些。

3,如果 Adaptee 接口很多,而且 Adaptee 和 ITarget 接口定义大部分都不相同,那我们推荐使用对象适配器,因为组合结构相对于继承更加灵活。

 

实际运用

做Android开发的同学大家应该都熟悉RecycleView 和ListView,在使用这个两个控件的时候,都需要自定义Adapter,RecycleView和ListView使用的不是同一个Adapter;这个Adapter就是对适配器模式很好的运用;

 

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