1. 简介
1.1 模式定义
将一个类的接口转换成客户端希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式的形式分为:类的适配器模式
& 对象的适配器模式。
1.2 类的适配器模式
类的适配器模式是把适配的类的API转换成为目标类的API。
1.3 对象的适配器模式
与类的适配器模式相同,对象的适配器模式也是把适配的类的API转换成为目标类的API。
1.4 与类的适配器模式不同的是
对象的适配器模式不是使用继承关系连接到Adaptee类,而是使用委派关系连接到Adaptee类。
1.5 两种适配器比较
对象适配器:
使用组合的方式, 不仅能适配一个被适配者的类, 还可以适配它的任何一个子类;
使用的是组合而不是继承, 通过多写几行代码把事情委托给了被适配者. 这样很灵活;
对适配器添加的任何行为对被适配者和它的子类都起作用; …
类适配器:
只能适配一个特定的类, 但它不需要重新实现整个被适配者的功能.而且它还可以重写被适配者的行为;
需要一个适配器和一个被适配者, 只需要一个类就行;
2. 对象适配器
最典型的就是 FutureTask 实现的是runable接口,构造器委派的是callable接口
2.1 被适配类
package adapter.objectAdapter.impl;
public class Adaptee {
public void SpecificOpertaion(){
}
}
2.2 被适配接口
package adapter.objectAdapter.impl;
interface TargetImpl {
//这是源类Adapteee没有的方法
void operation();
}
2.3 适配类
package adapter.objectAdapter;
import adapter.classAdapter.impl.TargetImpl;
import adapter.objectAdapter.impl.Adaptee;
public class Adapter implements TargetImpl {
// 直接关联被适配类
private Adaptee adaptee;
// 可以通过构造函数传入具体需要适配的被适配类对象
public Adapter (Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void operation() {
// 这里是使用委托的方式完成特殊功能
this.adaptee.SpecificOpertaion();
}
}
2.4 对象适配器测试类
package adapter.objectAdapter;
import adapter.classAdapter.impl.TargetImpl;
import adapter.objectAdapter.impl.Adaptee;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* 最典型的就是 FutureTask 实现的是runable接口,构造器委派的是callable接口
*/
public class AdapterPattern {
public static void main(String[] args) {
// 步骤4:定义具体使用目标类,并通过Adapter类调用所需要的方法从而实现目标
//需要先创建一个被适配类的对象作为参数
TargetImpl mAdapter = new Adapter(new Adaptee());
mAdapter.operation();
}
}
3. 类适配器
3.1 被适配类
package adapter.classAdapter.impl;
/**
* 创建源类(Adaptee)
*/
public class Adaptee {
public void SpecificOperation() {
}
}
3.2 被适配接口
package adapter.classAdapter.impl;
/**
* 创建Target接口;
*/
public interface TargetImpl {
//这是源类Adapteee没有的方法
void operation();
}
3.3 适配类
package adapter.classAdapter;
import adapter.classAdapter.impl.Adaptee;
import adapter.classAdapter.impl.TargetImpl;
//适配器Adapter继承自Adaptee,同时又实现了目标(TargetImpl)接口。
public class Adapter extends Adaptee implements TargetImpl {
//目标接口要求调用operation()这个方法名,但源类Adaptee没有方法operation()
//因此适配器补充上这个方法名
//但实际上operation()只是调用源类Adaptee的SpecificOpertaion()方法的内容
//所以适配器只是将SpecificOpertaion()方法作了一层封装,封装成Target可以调用的operation()而已
@Override
public void operation() {
this.SpecificOperation();
}
}
3.4 类适配器测试类
package adapter.classAdapter;
import adapter.classAdapter.impl.TargetImpl;
/**
*定义具体使用目标类,并通过Adapter类调用所需要的方法从而实现目标
*/
public class AdapterPattern {
public static void main(String[] args) {
TargetImpl mAdapter = new Adapter();
mAdapter.operation();
}
}