基本介绍
1.适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器。
2.适配器模式属于结构型模式
3.主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
类适配器模式介绍
基本介绍:Adater类,通过继承src类,实现dst类接口,完成src->dst的适配。
类适配器模式应用实例
1.应用实例说明
以生活中充电器的例子来讲解适配器,充电器本身相当于Adapter,220V交流电相当于src(即被适配者),我们的dst(即目标)是SV直流电
2.思路分析图解
3.代码实现
package com.adapter.classadapter; public class Voltage220V { //输出220V的电压 public int output220V(){ int src=220; System.out.println("电压" + src + "V"); return src; } }
package com.adapter.classadapter; //5v接口 public interface IVoltage5V { public int output5V(); }
package com.adapter.classadapter; /* *适配器类 */ public class VoltageAdapter extends Voltage220V implements IVoltage5V{ @Override public int output5V() { //获取到220V的电压 int srcV = output220V(); int dstV = srcV / 44;//转成5V return dstV; } }
package com.adapter.classadapter; public class Phone { //充电 public void charging(IVoltage5V iVoltage5V){ if(5==iVoltage5V.output5V()){ System.out.println("电压为5V,可以充电~~"); }else if (5<iVoltage5V.output5V()){ System.out.println("电压大于5V,不能充电"); }else if(5>iVoltage5V.output5V()){ System.out.println("电压小于5V,不能充电"); } } }
package com.adapter.classadapter; public class Client { public static void main(String[] args) { System.out.println("=== 类适配器模式 ======"); Phone phone = new Phone(); phone.charging(new VoltageAdapter()); } }
运行结果;
=== 类适配器模式 ====== 电压220V 电压为5V,可以充电~~
类适配器模式的注意事项
1.java是单继承机制,所以类适配器需要继承src类这一点算是一个缺点,因为这要求dst必须是接口,有一定局限性。
2.src类的方法在Adapter中都会暴露出来,也增加了使用的成本。
3.由于其继承了src类,所以他可以根据需求重写src类的方法,使得Adapter的灵活性增强了。
对象适配器模式介绍
1.基本思路和类的适配器模式相同,只是将Adapter类做修改,不是将Adapter类做修改,不是竭诚src类,而是持有src类的实例,已解决兼容性的问题。即:持有src类,实现dst类接口库,完成src->dst的适配
3.根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。
3.对象适配器模式是适配器模式常用的一种。
代码实现:
package com.adapter.objectadapter; public class Voltage220V { //输出220V的电压 public int output220V(){ int src=220; System.out.println("电压" + src + "V"); return src; } }
package com.adapter.objectadapter; //5v接口 public interface IVoltage5V { public int output5V(); }
package com.adapter.objectadapter; /* *适配器类 */ public class VoltageAdapter implements IVoltage5V { private Voltage220V voltage220V;//关联关系-聚合 /** * 通过构造器,传入一个Voltage220V * @param voltage220V */ public VoltageAdapter(Voltage220V voltage220V) { this.voltage220V = voltage220V; } @Override public int output5V() { int dst = 0; //对通过构造函数传过来的对象进行判断,是否为空进行校验。 if(null !=voltage220V){ int src=voltage220V.output220V();//获取220V 电压 System.out.println("使用对象适配器,进行适配~~"); dst = src / 44; System.out.println("适配完成,输出的电压为="+dst); } return dst; } }
package com.adapter.objectadapter; public class Phone { //充电 public void charging(IVoltage5V iVoltage5V){ if(5==iVoltage5V.output5V()){ System.out.println("电压为5V,可以充电~~"); }else if (5<iVoltage5V.output5V()){ System.out.println("电压大于5V,不能充电"); }else if(5>iVoltage5V.output5V()){ System.out.println("电压小于5V,不能充电"); } } }
package com.adapter.objectadapter; public class Client { public static void main(String[] args) { System.out.println("=== 对象适配器模式 ======"); Phone phone = new Phone(); phone.charging(new VoltageAdapter(new Voltage220V())); } }
运行结果:
=== 对象适配器模式 ====== 电压220V 使用对象适配器,进行适配~~ 适配完成,输出的电压为=5 电压为5V,可以充电~~
对象适配器模式注意事项和细节总结
1.对象适配器模式和类适配器其实算是同一种思想,只不过实现方式不同。根据合成复用原则,使用组合替代继承,所以他解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口(也就是说你可以将目标对象写成类也是可以的)。
2.使用成本更低,更加灵活。
接口适配器模式介绍
1.一些书籍称为:适配器模式或缺省适配器模式。
2.当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并未该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。
3.适用于一个接口不想使用其所有的方法的情况。
注意:匿名内部类的使用
代码实现:
package com.adapter.interfaceadapter; /** * 接口 假设一共有4个方法 */ public interface Interface4 { public void m1(); public void m2(); public void m3(); public void m4(); }
package com.adapter.interfaceadapter; public abstract class AbsAdapter implements Interface4{ @Override public void m1() { } @Override public void m2() { } @Override public void m3() { } @Override public void m4() { } }
package com.adapter.interfaceadapter; public class Client { public static void main(String[] args) { AbsAdapter absAdapter = new AbsAdapter() { //只需要覆盖我们需要使用的接口中的方法 @Override public void m1() { System.out.println("使用了m1的方法"); } }; absAdapter.m1(); } }
运行结果:
使用了m1的方法
适配器模式总结
1.三种命名方式,是根据src是以怎样的形式给到Adapter(在Adapter里的形式)来命名的。
2.类适配器:以类给到,在Adapter里,就是将src当做类,继承。
对象适配器:以对象给到,在Adapter里,将src作为一个对象,持有。
接口适配器:以接口归到,在Adapter里,架构src作为一个接口,实现
3.Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作。
4.实际开发中,实现起来不拘泥于我们讲解的三种经典形式