适配器模式的定义很简单,就是作一个中间转换,相似港版的 iPad,iPhone 等电源插头,须要一个转换器,才能使用大陆的插座。html
直接上代码,很简单,很少总结了。ide
被适配的类,能够当作是一个旧系统里的稳定的类post
public class Adaptee { // 被适配的类 public void request() { System.out.println("被适配的类:request"); } }
下面的是新的接口,或者说须要适配的目标接口this
public interface ITarget { // 新的接口 void doTargetRequest(); } ////////////////////////////////////////////////////// public class NewTarget implements ITarget { @Override public void doTargetRequest() { System.out.println("NewTarget的目标方法:doRequest"); } }
类的适配器,经过类的继承实现,下面是适配器类 Adapter,经过继承被适配者—— Adaptee,把被适配者的 API—— request 适配给目标接口—— ITarget 的 API—— doTargetRequesturl
public class Adapter extends Adaptee implements ITarget { // 类的适配器:Adapter(经过继承实现) @Override public void doTargetRequest() { // 这里能够写一些业务代码,若是有参数,就是对参数的转换过程 super.request(); // 经过 Adapter,把被适配者的API——request,适配给了目标接口——doTargetRequest。实现了对既有代码的复用 // 这里能够写一些业务代码 } }
客户端调用spa
public class Main { public static void main(String[] args) { ITarget target = new NewTarget(); target.doTargetRequest(); // NewTarget的目标方法:doRequest ITarget iTarget = new Adapter(); iTarget.doTargetRequest(); // 被适配的类:request } }
类适配器经过继承被适配的类实现,而对象的适配器,经过组合被适配的类的引用实现code
Itarget接口,Adaptee 类都不变,适配器类以下:htm
public class Adapter2 implements ITarget { private Adaptee adaptee; // 经过组合的方式 public Adapter2(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void doTargetRequest() { // 这里能够写一些业务代码,若是有参数,就是对参数的转换过程 this.adaptee.request(); // 实现了对既有代码的复用,经过 Adapter,把被适配者的API——request,适配给了目标接口——doTargetRequest // 这里能够写一些业务代码 } }
客户端调用对象
public class Main2 { public static void main(String[] args) { ITarget target = new NewTarget(); target.doTargetRequest(); // NewTarget的目标方法:doRequest Adaptee adaptee = new Adaptee(); ITarget iTarget = new Adapter2(adaptee); iTarget.doTargetRequest(); // 被适配的类:request } }
若是一个类已经稳定存在了,不想修改它,可是还要为其增长新需求,且这个需求和类的现有接口不能彻底匹配,那么就可使用适配器模式实现接口的转换以便知足新需求。blog
或者是为两个已有的接口提供一种协同工做方式。
还有一种使用状况,好比软件版本的升级和向后兼容,一些 API都会用到适配器模式。
这也是标题的意思——接口转换的利器。
优势很直接,就是提升类的的稳定性,加强其复用性,在不改变现有类的前提下,拓展类的功能,且能解耦目标类和适配器类,符合了开闭原则。
缺点就是会增长系统复杂度,其实我我的以为微不足道
外观模式是为旧接口(通常是比较复杂的接口),提供一个对外的简单接口,或者说更方便使用的访问入口。外观模式参考:为复杂系统提供一个对外窗口的方案——外观模式总结
适配器模式是让两个已有的接口协同工做
更通常的看,外观模式也是一种特殊的适配器,只不过它适配的是整个系统(粒度更大一些),为一个系统提供一个方便访问的对外接口。
适配器模式用来转换不一样接口,使旧接口和新接口能无缝衔接
装饰模式不会改变接口,只是给接口增长新功能
最多见的有 I/O 包里的字符包装流,InputStreamReader、OutputStreamWriter 等,还有util 包里的Arrays.asList() 方法。