1、定义
适配器模式将一个类的接口,转换成客户期望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
2、实现方式
1)通过组合方式实现:
/** * 目标接口 */ public interface ThreePlugIf { /** * 使用三相电流供电 */ void powerWithThree(); }
客户端
package com.cn.shejimoshi.shipeiqimoshi; /** * 客户端 */ public class NoteBook { private ThreePlugIf threePlugIf; public NoteBook(ThreePlugIf threePlugIf) { this.threePlugIf = threePlugIf; } /** * 使用插座充电 */ public void charge(){ threePlugIf.powerWithThree(); } }
被适配的类
package com.cn.shejimoshi.shipeiqimoshi; /** *被适配类 */ public class GBTwoPlug { public void powerWithTwo(){ System.out.println("使用二相电流供电"); } }
适配器
package com.cn.shejimoshi.shipeiqimoshi; /** * 适配器 */ public class TwoPlugAdapter implements ThreePlugIf{ private GBTwoPlug gbTwoPlug; public TwoPlugAdapter(GBTwoPlug gbTwoPlug) { this.gbTwoPlug = gbTwoPlug; } public void powerWithThree() { System.out.println("转换--通过组合方式实现适配器模式"); gbTwoPlug.powerWithTwo(); } }
说明:适配器将GBTwoPlug 类的接口powerWithTwo,转换成客户NoteBook 期望的另外一个接口powerWithThree。使得原本不兼容的NoteBook 和GBTwoPlug类可以在一起工作。
2)通过继承方式实现
适配器修改为:
package com.cn.shejimoshi.shipeiqimoshi; public class TwoPlugAdaterExtend extends GBTwoPlug implements ThreePlugIf { public void powerWithThree() { System.out.println("转换--通过继承方式实现适配器模式"); powerWithTwo(); } }
测试方法
public class NoteBookTest { @Test public void charge(){//测试组合方式 GBTwoPlug gbTwoPlug=new GBTwoPlug(); ThreePlugIf threePlugIf=new TwoPlugAdapter(gbTwoPlug); NoteBook noteBook=new NoteBook(threePlugIf); noteBook.charge(); } @Test public void charge2(){//测试继承方式 ThreePlugIf threePlugIf=new TwoPlugAdaterExtend(); NoteBook noteBook=new NoteBook(threePlugIf); noteBook.charge(); } }
3、组合与继承实现方式的比较
- 组合方式:可以基于面向接口编程适配多个被适配类,比如将适配器中的GBTwoPlug 域改成某个接口,建议使用组合方式
- 继承方式:由于只能继承一个父类,故只能适配一个被适配类
4、适配器的作用
- 将目标类和适配者类解耦,通过引入一个适配器类重用现有的是配者类,而无需修改原有代码
- 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的
写在最后:
设计模式是一种经验总结、编程思想,拒绝代码的迷惑。
一种设计模式的代码变体可以有很多,但万变不离其宗。