版权声明:本文为博主原创,未经博主允许不得转载。 https://blog.csdn.net/weixin_36904568/article/details/89946984
1. 定义
把一个类的接口变换成客户端所期待的另一种接口,使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
2. 使用
把适配的类的API转换成为目标类的API
(1)类适配——多重继承
- 抽象目标(由于JAVA无法实现双重继承,此处为抽象接口)
- 抽象被适配者
- 适配器:继承目标+被适配器,转换具体被适配对象
- 客户:通过目标接口,调用适配器的方法,发出适配请求,得到适配对象
特点:
- 是静态的定义方式
- 只能处理具体的被适配类
- 适配器可以重新定义被适配类的部分行为,相当于子类覆盖父类的部分实现方法
- 不需要重新实现整个被适配类,只需要实现需要转换的方法即可
目标
package AdapterPattern.ClassAdapter;
/**
* 抽象目标
*/
public interface Target {
//目标方法1
public void operator1();
//目标方法2
public void operator2();
}
被适配者
package AdapterPattern.ClassAdapter;
/**
* 被适配者
*/
public class Adaptee {
//被适配的方法
public void operator1(){
System.out.println("被适配的方法");
}
}
适配器
package AdapterPattern.ClassAdapter;
/**
* 适配器
*/
public class Adapter extends Adaptee implements Target
{
@Override
public void operator2() {
System.out.println("把被适配的方法映射为目标的方法2");
}
}
测试
package AdapterPattern.ClassAdapter;
public class Test {
public static void main(String[] args) {
Target target = new Adapter();
target.operator1();
target.operator2();
}
}
(2)对象适配——组合
- 抽象目标接口
- 抽象被适配者
- 适配器:实现目标接口,转换具体被适配对象
- 客户:通过目标接口,把具体被适配器对象通过适配器的方法,得到适配对象
特点:
- 是动态组合的方式
- 同一个适配器可以把类和它的子类都适配到目标接口
- 需要定义被适配者的子类来实现重定义,然后让适配器组合子类
- 需要重新实现整个被适配类
目标
package AdapterPattern.ObjectAdapter;
/**
* 抽象目标
*/
public interface Target {
//目标方法1
public void operator1();
//目标方法2
public void operator2();
}
被适配者
package AdapterPattern.ObjectAdapter;
/**
* 被适配者
*/
public class Adaptee {
//被适配的方法1
public void operator1(){
System.out.println("被适配的方法1");
}
}
适配器
package AdapterPattern.ObjectAdapter;
/**
* 适配器
*/
public class Adapter implements Target
{
private Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void operator1() {
adaptee.operator1();
}
@Override
public void operator2() {
System.out.println("把被适配的方法映射为目标的方法");
}
}
测试
package AdapterPattern.ObjectAdapter;
public class Test {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.operator1();
target.operator2();
}
}
3. 特点
- 在实现适配器功能的时候,可以调用自己开发的功能,自然地扩展系统的功能
- 方便复用现有的类
4. 缺省适配
如果不准备实现一个接口的所有方法时,就可以使用“缺省适配模式”制造一个抽象类,给出所有方法的平庸的具体实现。
package AdapterPattern.DefaultAdapter;
/**
* 公共接口
*/
public interface Service {
public void operator1();
public int operator2();
public String operator3();
}
package AdapterPattern.DefaultAdapter;
public abstract class DefaultAdapter implements Service{
@Override
public void operator1() {
}
@Override
public int operator2() {
return 0;
}
@Override
public String operator3() {
return null;
}
}