简单介绍适配器设计模式(内含代码分析)
适配器(Adapter Pattern) 就是有一个已有的类,但是这个类的接口和你的不一样,不能直接拿来使用,这个时候就需要使用适配器来帮你了.
适配器的三个特点 :
适配器对象实现原有接口
适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯对象)
对适配器原有接口方法的调用被委托给新接口的实例的特定的方法
模拟的场景 : 买了一个英标插头的插件(电器,使用3个插头的),但是国内的插座都是两个插头的,此时,就需要一个转接口使得在英标插头的电器也可以在国内进行充电,此时需要借助的是适配器设计模式
UML图 :
步骤:
1 创建一个国际接口以及它的实现类
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/2 15:29 4 * @Version 1.0 5 * 国际插头 6 */ 7 public interface CnPlugInterface { 8 void chargewith2Pins(); //国际插头只能使用两个角的 9 } 10 11 public class CnPlugin implements CnPlugInterface { 12 @Override 13 public void chargewith2Pins() { 14 System.out.println("使用两个角的插座充电"); 15 } 16 }
2创建一个英标的接口以及它的实现类
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/2 15:34 4 * @Version 1.0 5 * 英标插头 6 */ 7 public interface EnPluginInterface { 8 void chargeWith3Pins(); //英标插头使用的是3个角的充电 9 } 10 11 public class EnPlugin implements EnPluginInterface { 12 @Override 13 public void chargeWith3Pins() { 14 System.out.println("使用3个角的插座充电"); 15 } 16 }
3模拟一个Home类(模拟一个在国内的家庭,只能使用国际插头)
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/2 15:30 4 * @Version 1.0 5 * 模仿在家充电的过程 6 */ 7 public class Home { 8 private CnPlugInterface cnPlug; 9 10 public Home() { 11 } 12 13 public Home(CnPlugInterface cnPlug) { 14 this.cnPlug = cnPlug; 15 } 16 17 public void setCnPlug(CnPlugInterface cnPlug) { 18 this.cnPlug = cnPlug; 19 } 20 21 public void charge(){ 22 cnPlug.chargewith2Pins(); //国际充电是使用的是2个角的 23 } 24 }
4新建一个适配器Adapter,功能是实现英标插头对国际插头的转换:
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/2 15:37 4 * @Version 1.0 5 * 适配器要求 : 6 * 1 适配器必须实现原有旧的接口 7 * 2 适配器对象中持有对新接口的引用,当调用就接口时,将这个调用委托给实现新接口的对象 8 * 来处理,也就是在适配器对象中组合一个新接口 9 */ 10 public class PluginAdapter implements CnPlugInterface{ 11 private EnPluginInterface enPlugin; 12 13 public PluginAdapter() { 14 } 15 16 public PluginAdapter(EnPluginInterface enPlugin) { 17 this.enPlugin = enPlugin; 18 } 19 20 //适配器实现了英标的插头,然后重载国际的充电方法为英标的方法 21 @Override 22 public void chargewith2Pins() { 23 enPlugin.chargeWith3Pins(); 24 } 25 }
5新建一个测试类进行模拟场景:
1 /** 2 * @Author : zhuhuicong 3 * 2018/12/2 15:40 4 * @Version 1.0 5 */ 6 public class AdapterTest { 7 public static void main(String[] args) { 8 EnPluginInterface enPlugin = new EnPlugin(); //模拟的场景是买了个英标插头的插件 9 Home home = new Home(); //模拟在国内的家庭 10 PluginAdapter pluginAdapter = new PluginAdapter(enPlugin); //使用适配器,转接口 11 home.setCnPlug(pluginAdapter); 12 home.charge(); //调用充电的方法 13 } 14 }
注明 : 以上整理的资料均来自实验楼学习网站.......