说到适配器,小秋第一想到的是咱们电脑的电源适配器,它可以将220v,110v等不一样电压转换为咱们电脑须要的电压值供电脑使用,那么你知道适配器模式是怎样实现的吗,下面就和小秋一块儿探索一下适配器的工做模式吧html
将一个类的接口转换成客户但愿的另外一个接口java
一般状况下,客户端能够经过目标类的接口访问它所提供的服务。有时,现有的类能够知足客户类的功能须要,可是它所提供的接口不必定是客户类所指望的,这多是由于现有类中方法名与目标类中定义的方法名不一致等缘由所致使的。数据库
经过多重继承将apdatee2接口与target接口进行匹配,将适配的类apdatee2的API转换成为目标类的API设计模式
因为适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一块儿工做,由于继承是静态的关系,当适配器继承了Adaptee后,就不可能再去处理 Adaptee的子类了ide
被适配的类的API转换成为目标类的API,与类的适配器模式不一样的是,对象的适配器模式不是使用继承关系链接到Adaptee类而是使用委派关系链接到Adaptee类工具
目标接口(客户端调用的接口)this
package adapter; //目标接口(客户端须要使用的接口) public interface Target { //客户端须要请求处理的方法 public void request(); }
源接口(须要被适配的接口)spa
package adapter; //源接口(已经存在的接口) //须要被转换的对象 //这个接口须要从新配置以适应目标接口 public class Adaptee { public void specifiRequest() { System.out.println("源接口对象调用源接口中的方法"); } }
适配器设计
package adapter; public class Adapter implements Target { //持有源接口对象 private Adaptee adaptee; /** * 构造方法,传入须要被适配的对象 * @param adaptee */ public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } /** * 重写目标接口的方法,以适应客户端的需求 */ @Override public void request() { //调用源接口的方法 System.out.println("适配器包装源接口对象,调用源接口的方法"); adaptee.specifiRequest(); } }
客户端代理
package adapter; public class Client { public static void main(String[] args){ //建立源对象(被适配的对象) Adaptee adaptee = new Adaptee(); //利用源对象对象一个适配器对象,提供客户端调用的方法 Adapter adapter = new Adapter(adaptee); System.out.println("客户端调用适配器中的方法"); adapter.request(); } } //客户端调用适配器中的方法 //适配器包装源接口对象,调用源接口的方法 //源接口对象调用源接口中的方法
目标类和适配者类解耦,增长了类的透明性和复用性,同时系统的灵活性和扩展性都很是好,更换适配器或者增长新的适配器都很是方便,符合“开闭原则”
过多的使用适配器,会让系统很是零乱,不易总体进行把握。好比,明明看到调用的是A接口,其实内部被适配成了B接口的实现
Java语言的数据库链接工具JDBC,JDBC给出一个客户端通用的抽象接口,每个具体数据库引擎(如SQL Server、Oracle、MySQL等)的JDBC驱动软件都是一个介于JDBC接口和数据库引擎接口之间的适配器软件
想要复用一些现有的类,可是接口与复用环境要求不一致
适配器模式
装饰器模式
'装饰模式与适配器模式是不冲突的,能够既加强原有功能,又添加全新的功能。
最后附上一张适配器的概览图