适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
主要分为三种:
1.类的适配器模式
2.对象的适配器模式
3.接口的适配器模式
1.类的适配器模式
核心思想就是:
有一个Source类,拥有一个方法,有一个目标接口Targetable,
通过Adapter类,将Source的功能扩展到Targetable里。
其实是扩展到Targetable的实现类Adapter里,Targetable只是一个接口!
打个不恰当的比方:
两个国家,AB国类似于英格兰,苏格兰等
A国女王管理A国,有一个管理方法methodA,
B国男王也想管理A国,有一个虚拟的方法methodA,以为没有权利所以是虚拟的嘛!
那B国国王怎样能管理A国呢,就是跟A女王生一个孩子Adapter,就间接管理到了A国。
上代码:
public class KingA {
public void ManageStateA(){
System.out.println("Manage State A");
}
}
public interface KingB {
public void ManageStateA();
}
public class Adapter extends KingA implements KingB {
}
测试代码:
public static void main(String[] args) {
KingB mKingB = new Adapter();
mKingB.ManageStateA();
}
打印结果
Manage State A
是不是 KingB 管理到了A国?
2.对象的适配器模式
如果B国国王娶不到A国女王怎么办?
如果B国国王的儿子一直努力努力,南征北战当上大帝国皇帝(类似于英国女王, AB国类似于英格兰,苏格兰等)
那A国这也就是B国国王的儿子管辖下的一个元素而已,这样子B国国王也能管理到A国!但是得通过A国国王的传达!不能直接下命令
假设这个儿子叫Wrapper吧!
public class Wrapper implements KingB {
private KingA mKingA;
public Wrapper(KingA mKingA){
this.mKingA = mKingA;
}
@Override
public void ManageStateA() {
mKingA.ManageStateA();
}
}
测试代码:
public static void main(String[] args) {
KingA mKingA = new KingA();
KingB mKingB = new Wrapper(mKingA);
mKingB.ManageStateA();
}
3.接口的适配器模式
接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。
public interface Sourceable {
public void methodA();
public void methodB();
}
实现虚拟类:
public abstract class Wrapper implements Sourceable{
public void methodA(){}
public void methodB(){}
}
public class SourceSubA extends Wrapper {
public void methodA(){
System.out.println("the sourceable interface's first SubA!");
}
}
public class SourceSubB extends Wrapper {
public void methodB(){
System.out.println("the sourceable interface's second SubB!");
}
}
测试代码:
public static void main(String[] args) {
Sourceable sourceA = new SourceSubA();
Sourceable sourceB = new SourceSubB();
sourceA.methodA();
sourceB.methodB();
sourceA.methodA();
sourceB.methodB();
}
测试输出:
the sourceable interface's first Sub1!
the sourceable interface's second Sub2!
达到了我们的效果!
讲了这么多,总结一下三种适配器模式的应用场景:
类的适配器模式: 当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
对象的适配器模式: 当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。
接口的适配器模式: 当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。