设计模式之适配器模式
适配器模式就像我们用220v的电压给5v的手机充电,中间需要一个充电器,而这个充电器就是适配器,其中,适配器模式有3种:
类适配器
Ivoltage5V是5v的接口,Voltage220V是220V的接口,
VoltageAdpter是适配器,VoltageAdpter实现Ivoltage5V并继承Voltage220V,如下图:
附上完整代码:
package com.atguigu.adapter.classadapter;
//适配接口
public interface IVoltage5V {
public int output5V();
}
package com.atguigu.adapter.classadapter;
//被适配的类
public class Voltage220V {
//输出220V的电压
public int output220V() {
int src = 220;
System.out.println("电压=" + src + "伏");
return src;
}
}
package com.atguigu.adapter.classadapter;
//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
@Override
public int output5V() {
// TODO Auto-generated method stub
//获取到220V电压
int srcV = output220V();
int dstV = srcV / 44 ; //转成 5v
return dstV;
}
}
然后Phone类聚合这个5V的适配器:
package com.atguigu.adapter.classadapter;
public class Phone {
//充电
public void charging(IVoltage5V iVoltage5V) {
if(iVoltage5V.output5V() == 5) {
System.out.println("电压为5V, 可以充电~~");
} else if (iVoltage5V.output5V() > 5) {
System.out.println("电压大于5V, 不能充电~~");
}
}
}
接着Client类new 一个phone:
package com.atguigu.adapter.classadapter;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(" === 类适配器模式 ====");
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
这种适配器使用继承,我们还降低耦合,我们就将继承改为组合,就引出了对象适配器
对象适配器:
package com.atguigu.adapter.objectadapter;
//适配器类
public class VoltageAdapter implements IVoltage5V {
private Voltage220V voltage220V; // 关联关系-聚合
//通过构造器,传入一个 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;
}
}
将原来的继承改成组合,降低了耦合
接口适配器:
假设适配器里面有很多方法,而我们可能不完全需要使用适配器,我们就可以使用接口适配器
Interface4里面有多个方法,我们用用一个抽象类实现它的所有方法,只需要去覆盖我们 需要使用 接口方法即可
package com.atguigu.adapter.interfaceadapter;
public class Client {
public static void main(String[] args) {
AbsAdapter absAdapter = new AbsAdapter() {
//只需要去覆盖我们 需要使用 接口方法
@Override
public void m1() {
// TODO Auto-generated method stub
System.out.println("使用了m1的方法");
}
};
absAdapter.m1();
}
}
值得一提的是,springMVC中的dispatcher就使用了这种模式,先是从Controller获得某个请求,然后通过dispatcherServlet的dodispatch找到对应的HandlerAdapter,再通过对应HandlerAdapter执行相应的Controller方法。