上文(抽象工厂模式+单例):https://blog.csdn.net/qq_16498553/article/details/106450987
背景
各国的电压大致分为110V和220V, 一部手机或一部电脑不能直接使用这么高的电压的,需要通过变压器才能直接使用。要不然一插就炸了...
适配器模式是什么?
适配器模式也叫变压器模式,属于结构型模式,用于两个不同的对象互相转换,将原本不能一起工作或各自单个的对象可以一起工作,该模式在实际开发过程中非常常用;
模式可以干什么?
适配器主要用于将两种不同的对象做兼容,起到一个转换的作用。让原本不相干的东西,或不匹配的可以兼容使用。比如电压方面的,美图是110V而中国是220V,原来美国的电器支持不了中国的,电压,一插就挂了。所以通过变压器,将不能兼容的电器用起来。
优点:
提升复用性,并且可以解藕,不影响原有功能,并且减化了实际流程,很好的起到一个解耦作用;
提升拓展性,原来要绕3公里才能到的现在100米就解决了,呵呵;还有一点就是原来的接口不用了,你只需要把这个拓展的功能干掉就可以了,不用去改很多代码,有利用后期维护。
缺点:
对不相干或完全不一样的对象,会导致转换的成本非常高,并且实现过程也异常复杂;
局限性比较高,只能适配专用,而且每兼容一种对象/物品都需要经过特殊处理;
类图
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
实现代码
/**
* @Auther: csh
* @Date: 2020/5/20 17:17
* @Description:抽象输出接口
*/
public interface IVoltage {
public int outPutVoltage();
}
/**
* @Auther: csh
* @Date: 2020/5/19 17:35
* @Description:11V电压
*/
public class Voltage110V implements IVoltage{
private final static int VOLTAGE = 110;
@Override
public int outPutVoltage() {
return VOLTAGE;
}
}
/**
* @Auther: csh
* @Date: 2020/5/19 17:35
* @Description:220V电压
*/
public class Voltage220V implements IVoltage{
private final static int VOLTAGE = 220;
@Override
public int outPutVoltage() {
return VOLTAGE;
}
}
/**
* @Auther: csh
* @Date: 2020/5/20 16:59
* @Description:5V接口
*/
public interface IOutVoltage5V {
int outVoltage5V();
}
/**
* @Auther: csh
* @Date: 2020/5/20 16:59
* @Description:12V接口
*/
public interface IOutVoltage12V {
int outVoltage12V();
}
/**
* @Auther: csh
* @Date: 2020/5/20 17:06
* @Description:手机用5V电压
*/
public class Phone {
private int voltage5v=5;
void charging(IOutVoltage5V voltage5V){
//判断用何种充电
int i = voltage5V.outVoltage5V();
if(voltage5v == i){
System.out.println("手机充电中....");
}else{
System.out.println("电压不一致......");
}
}
}
/**
* @Auther: csh
* @Date: 2020/5/20 17:10
* @Description:
*/
public class Computer {
private int voltage12v=12;
void charging(IOutVoltage12V voltage12V){
//判断用何种充电
int i = voltage12V.outVoltage12V();
if(voltage12v == i){
System.out.println("电脑正在充电中....");
}else{
System.out.println("电压不一致......");
}
}
}
/**
* @Auther: csh
* @Date: 2020/5/20 17:01
* @Description:中国适配器
*/
public class ChinaAdapter extends Voltage220V implements IOutVoltage5V, IOutVoltage12V {
int voltage12V = super.outPutVoltage();
int voltage5V = super.outPutVoltage();
@Override
public int outVoltage12V() {
System.out.println("将中国的220V转成12V...");
voltage12V = 12;
return voltage12V;
}
@Override
public int outVoltage5V() {
System.out.println("将中国的220V转成5V...");
voltage5V = 5;
return voltage5V;
}
}
/**
* @Auther: csh
* @Date: 2020/5/20 17:01
* @Description:中国适配器
*/
public class AmericaAdapter extends Voltage110V implements IOutVoltage5V, IOutVoltage12V {
int voltage12V = super.outPutVoltage();
int voltage5V = super.outPutVoltage();
@Override
public int outVoltage12V() {
System.out.println("将美国的110V转成12V...");
voltage12V = 12;
return voltage12V;
}
@Override
public int outVoltage5V() {
System.out.println("将美国的110V转成5V...");
voltage5V = 5;
return voltage5V;
}
}
/**
* @Auther: csh
* @Date: 2020/5/20 15:08
* @Description:适配器
*/
public class Client {
public static void main(String[] args) {
//中国转换器
//手机充电
Phone phone = new Phone();
ChinaAdapter chinaAdapter = new ChinaAdapter();
phone.charging(chinaAdapter);
//电脑充电
Computer computer = new Computer();
computer.charging(chinaAdapter);
//美国转换器
//手机充电
Phone phone2 = new Phone();
ChinaAdapter chinaAdapter2 = new ChinaAdapter();
phone2.charging(chinaAdapter2);
//电脑充电
Computer computer2 = new Computer();
computer2.charging(chinaAdapter2);
//可以自己再拓展一个整合各个国家的转换器...
}
}
结果
将中国的220V转成5V...
手机充电中....
将中国的220V转成12V...
电脑正在充电中....
将中国的220V转成5V...
手机充电中....
将中国的220V转成12V...
电脑正在充电中....
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
最后
其实在各大开源产品中,类似适配器模式是被广泛应用,学习一个模式简单,但是应用好一个模式真的不容易,需要在日常开发过程中广泛应用于实际项目单看没啥用,呵呵!
spring用到适配器如下:
HandlerAdapter
MethodBeforeAdvice
AfterReturningAdvice
ThrowsAdvice
MethodBeforeAdviceInterceptor
AfterReturningAdviceInterceptor
ThrowsAdviceInterceptor