1、前言设计模式
适配器模式分为两类,所谓“适配”就是适当的配合或者恰当的配合,想一下电源的适配器,完成的做用是将交流电220V转化成不一样的直流电压,来对手机、电脑、台灯等充电,若是没有这些适配器,咱们的设备早就着火了或者报废了,是一件很可怕的事情,那么适配器就是起到一个转换的做用,将物质(数据)由某种形式转换成另外一种形式,使得适配后的一方可以接收和使用,那么咱们经过分析也知道,适配器中的角色大致上分为三种使用适配器的角色(手机等)、适配器自己(适配器)、被适配的角色(交流电)。但是做为高内聚低耦合的设计思想指导,咱们在手机和适配器中间再加上一层接口,手机直接使用这个接口来使用适配器,而不是高耦合的直接使用,所以主要的角色就有四个了。再考虑到适配器和被适配的角色之间的适配方式,咱们可使用继承来适配也可使用组合来适配,所以,适配器也就分为经过使用继承的适配器——类适配器和使用组合(委托)的适配器——对象适配器。函数
2、类适配器this
package zyr.dp.adapter; public class Banner { private String name; public Banner(String name){ this.name=name; } public void showWithParen(){ System.out.println("("+name+")"); } public void showWithAster(){ System.out.println("*"+name+"*"); } }
package zyr.dp.adapter; public interface Print { public abstract void printWeak(); public abstract void printStrong(); }
package zyr.dp.adapter; public class PrintBanner extends Banner implements Print { public PrintBanner(String name) { super(name); } public void printWeak() { System.out.println("...开始弱适配..."); showWithParen(); System.out.println("...弱适配成功..."); System.out.println(); } public void printStrong() { System.out.println("...开始强适配..."); showWithAster(); System.out.println("...强适配成功..."); System.out.println(); } }
能够看到使用适配器,咱们将Banner对象这个很高的电压经过PrintBanner这个适配器进行适配以后,经过main函数进行使用,使用的时候经过print接口进行引用,便于程序的可扩展性,好比说还有一个适配器对字符串进行了处理,咱们只用在main中修改很是少的代码便可以使用,这样就实现了低内聚高耦合。.net
3、对象适配器设计
package zyr.dp.adapter.objectpattern; public class Banner { private String name; public Banner(String name){ this.name=name; } public void showWithParen(){ System.out.println("("+name+")"); } public void showWithAster(){ System.out.println("*"+name+"*"); } }
package zyr.dp.adapter.objectpattern; public abstract class Print { public abstract void printWeak(); public abstract void printStrong(); }
package zyr.dp.adapter.objectpattern; public class PrintBanner extends Print { Banner banner; public PrintBanner(String name) { banner=new Banner(name); } public void printWeak() { System.out.println("...开始弱适配..."); banner.showWithParen(); System.out.println("...弱适配成功..."); System.out.println(); } public void printStrong() { System.out.println("...开始强适配..."); banner.showWithAster(); System.out.println("...强适配成功..."); System.out.println(); } }
package zyr.dp.adapter.objectpattern; public class Main { public static void main(String[] args) { Print p=new PrintBanner("朱彦荣"); p.printStrong(); p.printWeak(); } }
能够看到main函数、banner类都没有改动,将print接口变成抽象类,那么printBanner不能同时继承两个类,所以将banner对象组合到适配器之中,所以叫作对象适配器,这样也能够实现预期的结果。二者的区别也是很是明显的,推荐使用前者,或者根据实际状况须要进行甄别。code
4、总结对象
适配器模式有两种,咱们须要根据实际状况来使用,咱们可能使用一些已经封装好的代码,有的时候须要对其进行稍微的修改,但是这些代码同时被其它组件锁使用,咱们不能再原来的程序上改动,所以经过适配器模式,咱们将这些代码进行进一步的处理,而后再使用,咱们不能再原来的程序上改动,所以经过适配器模式,咱们将这些代码进行进一步处理,而后再使用,这样的设计方法很是好,由于咱们保证了在不修改原来代码的状况下实现了代码的复用和个性化。通常在系统升级的时候,须要保证兼容性,咱们将新系统做为被适配的对象,经过本身定义的适配器保证在旧系统上一节可使用以前的功能,保证了兼容性。blog