说道JAVA中的适配器模式,不得不引用该设计模式的固定表述“适配器模式(Adapter ):将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作”。该模式其实类似于90年代那会的稳压器,当时的电压没有现在这样稳定,看电视的时候经常会出现闪屏的现象,为此爷爷专门通过工作关系渠道搞到全村第一台稳压器(见下图,哎老爷子拍照之前也不说弄弄干净,大伙凑合看下),从此开启了童年里幸福的观影时光。
现在21世纪了,除了老旧的稳压器外,各种各样的适配器已经是随处可见了(各种手机充电适配器,电脑电源适配器等等),这里为了方便大家理解,我们用做常用的电脑电源适配器来讲解今天的设计模式,首先要明确的是在这整个过程中我们只有三个具体的对象,分别是电源(插座)、适配器,电脑(电池)。下来我们开始撸代码:
1 /*首先我们需要建立一个电源(插板)的接口,并提供对应方法 2 * (之所用接口是为了方便适配器实现) 3 */ 4 interface Power{ 5 public void electric(); 6 } 7 //首先我们需要建立一个电脑的接口,并提供对应方法 8 interface Computer{ 9 public void battery(); 10 } 11 //建立分别实现两个接口的类 12 class PowerImpl implements Power{ 13 @Override 14 public void electric() { 15 System.out.println("我有电"); 16 } 17 } 18 class ComputerImpl implements Computer{ 19 @Override 20 public void battery() { 21 System.out.println("我有电池"); 22 } 23 } 24 /* 25 * 建造适配器(这里我个人认为作为适配器,应该同时实现他所连接的两个接口 26 * ,在这里就是电源和电脑的接口) 27 */ 28 class Adapter implements Power,Computer{ 29 /*适配器中声明名两个接口,并分别建立构造方法 30 * (适配器中应该有支持两种接口的模块) 31 */ 32 Power power; 33 Computer computer; 34 35 public Adapter(Power power) { 36 super(); 37 this.power = power; 38 } 39 public Adapter(Computer computer) { 40 super(); 41 this.computer = computer; 42 } 43 /*适配器核心代码: 44 * 可以理解为要实现电脑电池充电的方法,就必须调用电源的电方法。 45 * 同理在这个过程中电源的电要实现自身价值,就必须调用电脑的电池。 46 */ 47 @Override 48 public void battery() { 49 power.electric(); 50 } 51 @Override 52 public void electric() { 53 computer.battery(); 54 } 55 }
测试类一:这里模拟在有电的情况下(即适配器一端已经连接电源插板),通过适配器调用电脑电池的过程
public class AdapterDemo { public static void main(String[] args) { Computer computer = new ComputerImpl();//实例化Computer(父类引用指向子类对象) Adapter a = new Adapter(computer);//实例化适配器,可以理解为将另外一端连接到电脑的过程 method(a); } //静态方法(已经提供了电) public static void method(Power p){ p.electric(); } }
输出结果:
1 我有电池
测试类二:这里模拟在有电脑(电池)的情况下(即适配器一端已经连接电脑),通过适配器调用power的过程
1 public class AdapterDemo1 { 2 public static void main(String[] args) { 3 Power power = new PowerImpl();//实例化Power(父类引用指向子类对象) 4 Adapter a = new Adapter(power); 5 method(a); 6 } 7 //静态方法(已经提供了电脑) 8 public static void method(Computer c){ 9 c.battery(); 10 } 11 }
输出结果:
1 我有电
这里写的比较规矩,方便初学者理解,大家也可以通过匿名内部类来简化(优化)这段代码,祝大伙撸的开心。