您的位置:首页 > 其它

设计模式——适配器模式详解

2017-06-18 21:54 253 查看
0. 前言  
写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~本文原创,转载请注明出处为SEU_Calvin的博客
适配器模式将不同的东西通过一种转换使得它们能够协作起来,比如使两个不兼容的类融合起来。尤其是在没有源代码、或者不修改源码中接口的情况下,使两个接口兼容。
 
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模式的一个很好的应用场景。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: