GoF设计模式 | 适配器模式
今天开始我们就要进入到结构型的设计模式学习之中了,今天讲的设计模式是23种设计模式的第六种——适配器模式。通俗的讲,适配器的作用就是将两个互不兼容的东西进行一个适配的操作,它作为中间的桥梁。 下面我们进入适配器模式的学习。
应用前景:
在现实生活中,适配器这样的例子随处可见。就比如用直流电的笔记本电脑接交流电源时需要一个电源适配器,中国人和外国人交流,中间需要一个翻译等等。
在软件设计中也可能出现:需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式就能很好地解决这些问题。
适配器模式的概念:
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
其别名为包装器。
特点:
适配器模式的主要优点:
客户端通过适配器可以透明地调用目标接口。 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
其缺点是:
对类适配器来说,更换适配器的实现过程比较复杂。
适配器模式工作原理:
适配器模式:将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。 从用户的角度看不到被适配者,它与目标类是解耦的。 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法。 用户收到反馈结果,感觉只是和目标接口交互。
1.类适配器模式
思路分析:
代码:
适配接口:
package cn.ppdxzz.adapter.classadapter;
/**
* Description:适配接口,输出5V的电压
* @Author: PeiChen
*/
publicinterfaceVoltage5V{
//定义一个输出5V电压的方法
intoutput5V();
}
被适配的类:
package cn.ppdxzz.adapter.classadapter;
/**
* Description:被适配的类,正常输出220V电压,需要被适配成5V电压
* @Author: PeiChen
*/
publicabstractclassVoltage220V{
//输出220V的电压
publicintoutput220V(){
int voltage = 220;
System.out.println("当前电压:" + voltage + "V");
return voltage;
}
}
充电类:
package cn.ppdxzz.adapter.classadapter;
/**
* Description:充电
* @Author: PeiChen
*/
publicclassPhone{
//定义一个给手机充电的方法
publicvoidcharging(Voltage5V v){
if (v.output5V() == 5) {
System.out.println("电压5V,允许充电");
}elseif (v.output5V() > 5){
System.out.println("电压过高,无法充电");
}else {
System.out.println("电压异常,禁止充电");
}
}
}
适配器类:
package cn.ppdxzz.adapter.classadapter;
/**
* Description:适配器类,这里要将220V电压适配成5V的电压
* @Author: PeiChen
*/
publicclassVoltageAdapterextendsVoltage220VimplementsVoltage5V{
//220V电压适配成5V电压
@Override
publicintoutput5V(){
int targetVoltage = 0;
//1.获取到需被适配的220V电压
int v = output220V();
//2.返回已适配的5V电压
targetVoltage = v/44;
System.out.println("适配完成,当前电压:" + targetVoltage + "V");
return targetVoltage;
}
}
类适配器模式测试:
package cn.ppdxzz.adapter.classadapter;
/**
* Description:类适配器模式
* @Author: PeiChen
*/
publicclassClient{
publicstaticvoidmain(String[] args){
Phone phone = new Phone();
//传入5V电压
phone.charging(new VoltageAdapter());
}
}
输出结果:
当前电压:220V适配完成,当前电压:5V
电压5V,允许充电
2.对象适配器模式
思路分析:
代码:
适配接口:
package cn.ppdxzz.adapter.objectadapter;/**
* Description:适配接口,输出5V的电压
* @Author: PeiChen
*/
publicinterfaceVoltage5V{
//定义一个输出5V电压的方法
intoutput5V();
}
被适配的类:
package cn.ppdxzz.adapter.objectadapter;/**
* Description:被适配的类
* @Author: PeiChen
*/
publicclassVoltage220V{
//输出220V的电压
publicintoutput220V(){
int voltage = 220;
System.out.println("当前电压:" + voltage + "V");
return voltage;
}
}
充电类:
package cn.ppdxzz.adapter.objectadapter;/**
* Description:充电
* @Author: PeiChen
*/
publicclassPhone{
//定义一个给手机充电的方法
publicvoidcharging(Voltage5V v){
if (v.output5V() == 5) {
System.out.println("电压5V,允许充电");
} elseif (v.output5V() > 5) {
System.out.println("电压过高,无法充电");
}else {
System.out.println("电压异常,禁止充电");
}
}
}
适配器类:
package cn.ppdxzz.adapter.objectadapter;
/**
* Description:适配器类,这里要将220V电压适配成5V的电压
* @Author: PeiChen
*/
publicclassVoltageAdapterimplementsVoltage5V{
private Voltage220V voltage220V;//聚合注入
publicVoltageAdapter(){
}
//通过构造器传入220V电压
publicVoltageAdapter(Voltage220V voltage220V){
this.voltage220V = voltage220V;
}
@Override
publicintoutput5V(){
int targetVoltage = 0;
if (voltage220V != null) {
//1.获取到需被适配的220V电压
int output220V = voltage220V.output220V();//得到需被适配的220V电压
//2.返回已适配的5V电压
targetVoltage = output220V/44;
System.out.println("适配完成,当前电压:" + targetVoltage + "V");
}
return targetVoltage;
}
}
对象适配器模式测试:
package cn.ppdxzz.adapter.objectadapter;
/**
* Description:对象适配器模式
* @Author: PeiChen
*/
publicclassClient{
publicstaticvoidmain(String[] args){
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
输出结果:
当前电压:220V适配完成,当前电压:5V
电压5V,允许充电
3.接口适配器模式
思路分析:
代码:
适配接口:
package cn.ppdxzz.adapter.interfaceadapter;
/**
* Description:适配接口
* @Author: PeiChen
*/
publicinterfaceInterfaceTest{
//定义三个测试方法
voidtest1();
voidtest2();
voidtest3();
}
适配器抽象类:
package cn.ppdxzz.adapter.interfaceadapter;/**
* Description:AbstractAdapter抽象类,默认实现接口的所有方法
* @Author: PeiChen
*/
publicabstractclassAbstractAdapterimplementsInterfaceTest{
@Override
publicvoidtest1(){
}
@Override
publicvoidtest2(){
}
@Override
publicvoidtest3(){
}
}
接口适配器模式测试:
package cn.ppdxzz.adapter.interfaceadapter;/**
* Description:接口适配器模式
* @Author: PeiChen
*/
publicclassClient{
publicstaticvoidmain(String[] args){
//匿名内部类
AbstractAdapter adapter = new AbstractAdapter() {
@Override
publicvoidtest1(){
super.test1();
System.out.println("测试test1方法");
}
};
adapter.test1();
}
}
输出结果:
测试test1方法
适配器模式源码分析:
SpringMVC中的HandlerAdapter就使用到了适配器模式。
总结:
适配器模式最大的作用还是将原本不兼容的接口融合在一起工作。
适配器模式到这里就讲解完毕了,后续会继续更新剩下的设计模式,敬请期待。
以上是 GoF设计模式 | 适配器模式 的全部内容, 来源链接: utcz.com/a/34515.html