设计模式之适配器模式
适配器,也叫做包装器,顾名思义,就是设计一个转接头,用来连接两个无法正常对接的类。
有这么一个场景,项目之初有人写了SmsService用于发短信,记录日志,同时将这个打成jar包,用于给多个项目组使用。
/**
* @author lw
* @date 2022/3/28 0028
* @description jar包里的短信服务
*/
public class SmsService {
public void send(String toPhone,String content){
LogRecord.log();
System.out.println("SmsService :"+content);
LogRecord.log();
}
}
项目用了好久这个类,突然有一天,项目老大说,阿里有个内部人员给了优惠,我们把发短信的方法用阿里的类吧。
而项目已经进行了好久,所有人都是用jar包里这个公司统一的发送短信。
那么放在面前的有这么几条路,
方案A、 改jar包中send(),改为调用阿里的服务,改成如下代码,这样就不用改项目中其他地方的使用了。
public class SmsService {
private AliSmsService aliSmsService;
public void send(String toPhone,String content){
//fromPhone,toPhone,content
aliSmsService.send("18731667182",toPhone,content);
}
}
但是这个jar包其他项目组在用,还是用公司的短信接口,所以pass;
方案B、修改项目中所有使用公司短信服务的代码,这也是常用的方式。
方案C、写一个适配器(我瞎编的方案C,实际全部同意使用了方案B)
public class SmsAdapter extends SmsService {
private AliSmsService aliSmsService;
@Override
public void send(String toPhone,String content){
this.aliSmsService.send("18731667182",toPhone,content);
}
}
然后调用中将所有SmsService改为SmsAdapter,如下,
//SmsService smsService = new SmsService();
SmsService smsService = new SmsAdapter();
smsService.send("toPhone","hello world");
其实这个和将SmsService改为AliSmsService是一样的,都是ctrl+c,ctrl+v。
但是我想说的是,这帮人还没有意识到,万一阿里的优惠到期了,没有了呢?重新用回公司的短信服务?
继续改写所有使用阿里的代码?
就算是写一个自己发送短信的OwnSmsService,其中调用阿里的Service也好啊,项目统一使用OwnSmsService,就算是以后优惠到期了,也可以改写OwnSmsService中的send()啊!
从上图可以看出,适配器,就是将以前不合适的类或者接口,继承或者实现后,再重写方法即可。
没什么是包装一层解决不了的,如果有那就说明要两层。