Adapter Pattern(适配器模式)
一、Adapter Pattern简介
将一个类的接口装换成客户希望的另外一个接口。Adapter模式使原本接口不兼容而不能一起工作的类可以一起工作
二、Adapter Pattern关键特征
名称 | 说明 |
---|---|
意图 | 使控制范围之外的一个原有对象与某个接口匹配 |
问题 | 系统的数据和行为都正确、接口不符合。通常用于抽象类派生时。 |
解决方案 | Adapter模式提供了具有所需接口的包装类 |
参与者与协作者 | Adapter改变了Adaptee的接口,使Adaptee与Adapter的基类Target匹配。这样Client就可以使用Adaptee了,就像他是Target类型 |
效果 | Adapter模式使原有对象能够适应新的类结构,不受其接口的影响 |
实现 | 将原有类包含在另一个类中。让包含类与需要的接口匹配,调用被包含类的方法 |
三、Adapter Pattern的两种方式
对象Adapter模式——上面说的就是对象Adapter模式。因为它依赖于一个对象(适配对象)包含另外一个对象(被适配的对象)。
类Adapter模式——另外一种实现Adapte模式的方式是通过多重继承。这种情况下的Adapter模式被称为类Adapter模式
类Adapter模式的工作原理是创建一个新类,该类同时从两个类继承:
1 从定义接口的抽象公共类继承
2 从访问其实现的原有类私有继承
每个被包装方法都调用其对应的私有继承的方法
对象Adapter模式图示
类Adapter模式图示
四、Facade Pattern与Adapter Pattern比较
选项 | Facade Pattern | Adapter Pattern |
---|---|---|
是否存在既有的类 | 是 | 是 |
是否必须按照某个接口设计 | 否 | 是 |
对象需要多台行为吗 | 否 | 可能 |
需要更就简单的接口吗 | 是 | 否 |
五、对象Adapter Pattern
5.1代码
package com.qwm.adapter;
/**
* Created by qiwenming on 16/6/24.
* 对象Adapter模式
*/
/**
* 原有的类
*/
class Adaptee{
public void specificRequest(){
System.out.println("特殊请求---");
}
}
/**
* 客户希望的接口
*/
interface Target{
void request();
}
/**
* 适配器
*/
class Adapter implements Target{
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.specificRequest();
}
}
/**
* 客户端
*/
class Client{
public static void main(String[] args){
Target target = new Adapter();
target.request();
}
}
5.2结果
特殊请求---
六、类Adapter Pattern
6.1代码
package com.qwm.adapter;
/**
* Created by qiwenming on 16/6/24.
* 类Adapter模式
*/
class Adaptee2{
public void specificRequest(){
System.out.println("class Adapter Pattern 特殊请求");
}
}
/**
* 客户希望的接口
*/
interface Target2{
void request();
}
/**
* 适配器类: 这里是和对象适配器最大的区别, 类适配器采用的是多重继承
*/
class Adapter2 extends Adaptee2 implements Target2{
@Override
public void request() {
specificRequest();
}
}
class Client2{
public static void main(String[] args){
Target2 target2 = new Adapter2();
target2.request();
}
}
6.2结果
class Adapter Pattern 特殊请求
七、源码下载
https://github.com/qiwenming/designpattern/tree/master/src/com/qwm/adapter