适配器(Adpater),顾名思义,与我们平时生活中常见的电源转换头一样,起着转换的作用,是用来适配的中间件,连接原本不匹配的两类。
适配器模式
定义:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
- 类适配器
- 对象适配器
- 接口适配器
UML图
- 目标:目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类
- 转换类:所有的请求都委托给被适配者
- 适配器:适配器与被适配者组合
例子
类适配器
原理:通过继承来实现适配器功能。
当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后再继承接口B的实现类BB,这样我们可以在适配器P中访问接口B的方法了,这时我们在适配器P中的接口A方法中直接引用BB中的合适方法,这样就完成了一个简单的类适配器。
现在我们有个安卓手机的充电器,但是事实上我们需要一个苹果手机的充电器,现在需要一个转换器来帮我们做到这点,给我们的苹果手机充上电,这时候可以试试类适配器。
package adapter;
/**
* 安卓充电器
*/
public interface Android {
void isAndroid();
}
package adapter;
/**
* 苹果充电器
*/
public interface iPhone {
void isIPhone();
}
package adapter;
/**
* 要适配者的具体实现类
*/
public class iPhone6s implements iPhone {
@Override
public void isIPhone() {
System.out.println("I'm iPhone");
}
}
定义一个转换器
package adapter;
public class iPhoneAdapter extends iPhone6s implements Android {
@Override
public void isAndroid() {
isIPhone();
}
}
测试
package test.adapter;
import adapter.Android;
import adapter.iPhoneAdapter;
public class test {
public static void main(String args[]){
Android android = new iPhoneAdapter();
android.isAndroid();
}
}
对象适配器
原理:通过组合来实现适配器功能。
当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后在适配器P中定义私有变量C(对象)(B接口指向变量名),再定义一个带参数的构造器用来为对象C赋值,再在A接口的方法实现中使用对象C调用其来源于B接口的方法。
package adapter;
/**
* 安卓充电器
*/
public interface Android {
void isAndroid();
}
package adapter;
/**
* 苹果充电器
*/
public interface iPhone {
void isIPhone();
}
package adapter;
/**
* 对象适配器
*/
public class iPhoneAdapter2 implements Android {
private iPhone iPhone;
public iPhoneAdapter2(adapter.iPhone iPhone) {
this.iPhone = iPhone;
}
@Override
public void isAndroid() {
iPhone.isIPhone();
}
}
测试
package test.adapter;
import adapter.Android;
import adapter.iPhone6s;
import adapter.iPhoneAdapter;
import adapter.iPhoneAdapter2;
public class test2 {
public static void main(String args[]){
Android android = new iPhoneAdapter2(new iPhone6s());
android.isAndroid();
}
}
接口适配器
原理:通过抽象类来实现适配,这种适配稍别于上面所述的适配。
当存在这样一个接口,其中定义了N多的方法,而我们现在却只想使用其中的一个到几个方法,如果我们直接实现接口,那么我们要对所有的方法进行实现,哪怕我们仅仅是对不需要的方法进行置空(只写一对大括号,不做具体方法实现)也会导致这个类变得臃肿,调用也不方便,这时我们可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有的方法都进行置空,那么我们在创建抽象类的继承类,而且重写我们需要使用的那几个方法即可。
package adapter;
public interface interfaceA {
void methoA();
void methodB();
void methodC();
void methodD();
}
package adapter;
public abstract class Adapter implements interfaceA{
@Override
public void methoA() {
}
@Override
public void methodB() {
}
@Override
public void methodC() {
}
@Override
public void methodD() {
}
}
package adapter;
public class concreteA extends Adapter {
@Override
public void methoA() {
System.out.println("1");
}
@Override
public void methodB() {
System.out.println("2");
}
}
小结
类适配器与对象适配器的极其相似,只是细节处稍显不同,两者都可适用于:
- 想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直接去访问,这时创建一个适配器就能间接去访问这个类中的方法。
- 我们有一个类,想将其设计为可重用的类(可被多处访问),我们可以创建适配器来将这个类来适配其他没有提供合适接口的类。
对于接口适配器,在想使用某些方法而不想全部实现时,可以使用。
源码在这里:我的github地址
其他设计模式:设计模式学习笔记