设计模式之适配器模式

适配器模式就像我们用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方法。

 

posted @ 2020-06-30 20:59  18软件工程五班陈星星  阅读(173)  评论(0编辑  收藏  举报