相信适配器这个概念对于大伙来说都不陌生了吧?曾经买过港货的通过都知道,港货当中的充电器插线头是很蛋疼的三插口的,但是我们平常的充电插座,一般都是两插口的,那么要解决这个问题,我们的适配器就登场了,能够完美的将三插口转换成两插口的接口,然后我们就能在我们的两插口插排上使用充电器啦,姑且上个图吧~(该篇随记是参考了:http://blog.csdn.net/jason0539/article/details/22468457)
了解了什么是适配器,那么适配器模式就一目了然了,适配器模式就是将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。以下是适配器模式的具体的角色:
1.目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
2.需要适配的类(Adaptee):需要适配的类或适配者类。
3.适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
二话不说,先上个代码过过瘾:
public interface Target { void twoInsert(); } //普通的实现了目标接口的类 public class ConcreteTarget implements Target { @Override public void twoInsert() { System.out.println("这个插头有两个插口"); } }
这是我们的目标接口和实现了目标接口的普通类。
//特殊的类,也就是我们例子当中的三插口的插头 public class ThreeInsertSocket { public void ThreeInsert() { System.out.println("这个插头有三个插口"); } }
这是我们的特殊类,接下来我们看看如何通过我们的适配器实现目标接口的twoInsert方法和ThreeInsert方法的适配,见证奇迹的时刻:
public class Adapter extends ThreeInsertSocket implements Target{ @Override public void twoInsert() { super.ThreeInsert(); } }
其实就是很简单的办法,首先通过适配器(adapter)去继承ThreeInsertSocket,把特殊的方法继承下来,然后再用适配器(adapter)去实现目标接口,通过重写目标接口的方法,在该方法当中调用继承下来的特殊方法即可,是不是很简单?
public class test { public static void main(String[] args) { //正常实现了目标接口的普通功能类 Target concreteTarget = new ConcreteTarget(); concreteTarget.twoInsert(); // 使用特殊功能类,即适配类 Target adapter = new Adapter(); adapter.twoInsert(); } }
这个插头有两个插口
这个插头有三个插口
这就是运行的结果。那么总体过程可以总结为以下的图:
图中的Adaptee对应的就是我们的ThreeInsertSocket,这就是适配器模式当中的类适配器的写法,类适配器是通过适配器类(adapter)继承所需要适配的对象(adaptee),并且再实现目标接口(target)来实现被适配对象(adaptee)和目标接口(target)之间的耦合的。那么除了这种方式,还有没有其他方式来实现二者的耦合呢?当然有,那就是对象适配器模式。
一言不合,我们先看代码:
public class Adapter implements Target { private ThreeInsertSocket adaptee; public Adapter(ThreeInsertSocket adaptee) { this.adaptee=adaptee; } @Override public void twoInsert() { adaptee.ThreeInsert(); } }
需要改动的就是我们的适配器类的代码,可以看到,对象适配器模式当中,相比类适配器模式,不再对被适配对象(Adaptee)进行继承,而是通过适配器类(adapter)的构造函数传入被适配对象(Adaptee)的实例,然后通过委托该实例实现target接口当中定义的方法(twoInsert)
public class test { public static void main(String[] args) { //正常实现了目标接口的普通功能类 Target concreteTarget = new ConcreteTarget(); concreteTarget.twoInsert(); // 使用特殊功能类,即适配类 ThreeInsertSocket adaptee=new ThreeInsertSocket(); Target adapter = new Adapter(adaptee); adapter.twoInsert(); } }
这个插头有两个插口
这个插头有三个插口
可以看出这时候各类和接口之间的关系图应该变为:
那么至此,我们的适配器模式也讲解完毕,下一节,我们将开始我们的重头戏,javaIO的学习~