适配器模式(Adapter)
适配器模式将某个类的接口转换成用户期望的另一个接口行为,目的是为了适应由于接口与接口之间不匹配所带来的类的兼容性问题。适配器模式主要分为三大类:类的适配器模式、对象的适配器模式、接口的适配器模式。首先我们来看第一种,类的适配器模式;
首先我们先创建一个类:
public class OperationA {
public void operationA(){
System.out.println("operation A");
}
}
接着我们再创建一个接口,用来适配上述的OperationA ,我们在这个接口中命名一个方法,跟上述类中的operationA方法同名
public interface Operation {
//与A中的方法相同
void operationA();
void operationB();
}
最后来创建适配器类,继承OperationA,实现Operation接口
public class ClassAdapter extends OperationA implements Operation{
public void operationB() {
System.out.println("operation B");
}
}
然后我们来测试一下:
public class AdaptTest {
public static void main(String[] args) {
//类适配器
Operation operation=new ClassAdapter();
operation.operationA();
operation.operationB();
}
输出结果
operation A
operation B
至此,适配器类实现了OperationA中的中的operationA()方法,这就是类适配器模式。接着,我们来看下对象适配器,其实就是修改下上述的适配器类,通过实例化OperationA类,放到适配器的构造函数中实现,代码如下:
public class ObjectAdapter implements Operation{
private OperationA operationA;
public ObjectAdapter(OperationA operationA) {
super();
this.operationA = operationA;
}
public void operationA() {
operationA.operationA();
}
public void operationB() {
System.out.println("operation B");
}
}
接着测试:
public class AdaptTest {
public static void main(String[] args) {
//对象适配器
OperationA operationA=new OperationA();
Operation objectAdapter=new ObjectAdapter(operationA);
objectAdapter.operationA();
objectAdapter.operationB();
}
输出结果:
operation A
operation B
同样适配器类也实现了类OperationA中的方法。最后我们来写接口适配器,有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,有时候这非常费事,因为我们并不需要实现所有的方法,我们只需要实现我们关心的方法,此时接口适配器模式就非常满足我们的需求。同样,先看代码:
首先我们需要声明一个抽象类,实现Operation接口,但是我们可以不写具体的实现内容,
public abstract class OperationFather implements Operation{
public void operationA() {
}
public void operationB() {
}
}
接着我们来写两个实现类,继承上述父类
Son1实现operationB方法
public class OperationSon1 extends OperationFather{
public void operationB() {
System.out.println("operationB son1");
}
}
Son2实现operationA方法
public class OperationSon2 extends OperationFather{
public void operationA() {
System.out.println("operationA son2");
}
}
这样就完成了,其实就是借用一个抽象类,具体的实现还是子类,我们真正要实现功能的是子类,但是子类不和原始接口照面。下面测试下:
public class AdaptTest {
public static void main(String[] args) {
//接口适配器
Operation operationSon1=new OperationSon1();
operationSon1.operationB();
Operation operationSon2=new OperationSon2();
operationSon2.operationA();
}
}
输出结果:
operationB son1
operationA son2
三种适配器模式的应用场景:
(1)类的适配器模式:当需要将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接。
(2)对象的适配器模式:当我们需要将一个对象转换成满足另一个新接口的对象时,可以创建一个包装类,new一个原类构造到包装类中,接着在包装类的方法中,调用原类的实例方法就行。
(3)接口的适配器模式:当不想实现一个接口中所有的方法时候,可以创建一个父抽象类,实现所有方法,我们实现子类功能的时候,继承父抽象类即可。