相信适配器这个概念对于大伙来讲都不陌生了吧?曾经买过港货的经过都知道,港货当中的充电器插线头是很蛋疼的三插口的,可是咱们日常的充电插座,通常都是两插口的,那么要解决这个问题,咱们的适配器就登场了,可以完美的将三插口转换成两插口的接口,而后咱们就能在咱们的两插口插排上使用充电器啦,姑且上个图吧~(该篇随记是参考了:http://blog.csdn.net/jason0539/article/details/22468457)java
了解了什么是适配器,那么适配器模式就一目了然了,适配器模式就是将一个类的接口转换成客户但愿的另一个接口。Adapter模式使得本来因为接口不兼容而不能一块儿工做的那些类能够在一块儿工做。如下是适配器模式的具体的角色:ide
1.目标接口(Target):客户所期待的接口。目标能够是具体的或抽象的类,也能够是接口。函数
2.须要适配的类(Adaptee):须要适配的类或适配者类。学习
3.适配器(Adapter):经过包装一个须要适配的对象,把原接口转换成目标接口。this
二话不说,先上个代码过过瘾:spa
public interface Target { void twoInsert(); } //普通的实现了目标接口的类 public class ConcreteTarget implements Target { @Override public void twoInsert() { System.out.println("这个插头有两个插口"); } }
这是咱们的目标接口和实现了目标接口的普通类。.net
//特殊的类,也就是咱们例子当中的三插口的插头 public class ThreeInsertSocket { public void ThreeInsert() { System.out.println("这个插头有三个插口"); } }
这是咱们的特殊类,接下来咱们看看如何经过咱们的适配器实现目标接口的twoInsert方法和ThreeInsert方法的适配,见证奇迹的时刻:code
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(); } }
这个插头有两个插口
这个插头有三个插口
这就是运行的结果。那么整体过程能够总结为如下的图:blog
图中的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的学习~