本文共 2128 字,大约阅读时间需要 7 分钟。
0. 前言
写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~本文原创,转载请注明出处为。
适配器模式将不同的东西通过一种转换使得它们能够协作起来,比如使两个不兼容的类融合起来。尤其是在没有源代码、或者不修改源码中接口的情况下,使两个接口兼容。
1. 适配器模式介绍
适配器模式定义:
适配器模式把一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不兼容而无法一起工作的两个类能一起工作。
适配器模式的使用场景:
(1)系统需要使用现有的类,而此类的接口不符合需要。
(2)需要一个统一的输出接口,而输入类型不可预知(如Android中的Adapter)。
(3)创建一个可以复用的类(如Android中的Adapter),使得该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
适配器模式包括的角色:
(1)目标Target类:客户所期待得到的接口。
(2)需要适配的Adaptee类:需要适配的类。
(3)适配器Adapter类:通过包装一个需要适配的对象,把原接口转换成目标接口。
2. 类适配器
从下面代码中可以看出,需要适配的类Adaptee,如何向客户提供所需要的接口呢,可以提供一个Adapter类继承Adaptee并实现Target接口即可。这就是所谓的类适配器。类图和代码如下。
/** * Adapter Pattern * Created by Calvin on 2017/5/10. */// 已存在的、具有特殊功能,但不符合我们既有的标准接口的类class Adaptee { public void specificRequest() { System.out.println("被适配的类,该类具有特殊功能"); }}// 目标接口interface Target { public void request();}// 具体目标类,只提供普通功能class ConcreteTarget implements Target { public void request() { System.out.println("普通类,该类具有普通功能"); }}// 适配器类,继承了被适配类,同时实现标准接口class Adapter extends Adaptee implements Target{ public void request() { super.specificRequest(); }}//测试类// 使用普通功能类Target concreteTarget = new ConcreteTarget();concreteTarget.request(); //输出“普通类,该类具有普通功能”// 使用特殊功能类,即适配类Target adapter = new Adapter();adapter.request(); //输出“被适配的类,该类具有特殊功能”
3. 对象适配器
类适配器使Adapter 类既继承了被适配类,又实现了 Target 接口,在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。
另外一种适配器模式是对象适配器,它不是使用继承再实现的方式,而是只实现标准接口,再在内部维护被适配类的引用的方式,类图和代码如下。
/** * Adapter Pattern * Created by Calvin on 2017/5/10. *///只需要修改适配器类即可//适配器类,只实现标准接口class Adapter implements Target{ private Adaptee adaptee; public Adapter (Adaptee adaptee) { this.adaptee = adaptee; } public void request() { this.adaptee.specificRequest(); }}//测试类Target concreteTarget = new ConcreteTarget();concreteTarget.request(); //输出“普通类,该类具有普通功能” //Adapter需要先创建一个被适配类的对象作为参数Target adapter = new Adapter(new Adaptee());adapter.request(); //输出“被适配的类,该类具有特殊功能”
4. 适配器模式总结
对象适配器比类适配器更加灵活、实用,毕竟少了一层继承关系。
总之适配器模式使现有的类可以满足新的需求,因此使现有功能能更好的复用。
在Android开发中,Adapter的使用在ListView中很常见,用户的Item各式各样,而最终都是getView()返回一个View。输入有无数种情况,但是输出类型统一。这也是Adapter模式的一个很好的应用场景。