Hello大家龙年好!
春节的假期转眼间过去,我们也要回归往日的节奏
因为最近和小伙伴们聊天发现,我们普遍在面试中,对被问起设计模式在工作中的应用,既有点熟悉,又有点陌生,
在网上看吧,又感觉鸡肋(为啥?不能解燃煤之急啊!哈哈),所以,为了打破这一尴尬的窘境,我亲自针对痛点来一篇(若写的不好,尽管喷!哈哈哈)
写之前,我先抛一道面试题,我们一起思考思考!(本篇对已工作或即将如职场的都是不错的巩固与积累,也强烈建议跟着操作一遍,你会有不一样的收获!)
面试官:你在工作中用到过设计模式吗?怎么运用的?(你别好家伙,先想想)
好了,别想了(哈哈哈),我们往下看
嗯,我在工作中用过一些设计模式(若没用过,也不要心虚,俺们按套路来),
- 我主要用到就是工厂模式,单例模式,策略模式,以及模版,代理模式等(你心里说我平常开发都是
if-else
啊!别急嘛,我们往下看),怎么运用的?(我们先说主体的大框架)
- 嗯~~~我采用的最多的是工厂,策略以及模版方法三种涉及模式的结合(先说使用的哪几种)
- 我当时在供工作中负责打车软件一个子模块商品链接的支付业务(给出自己工作中的案例)——
或者举自己工作中使用if_else多的屎山案例
- (这步关键)对于此支付服务,对于有微信支付宝以及银行卡等支付方式我是放到策略服务中,
- 对于公共的逻辑,如支付的前置检查以及支付后的后置处理这块的公共代码我是抽象出来放在模版方法模式中
- 对这些策略服务的管理,何时使用?,我就采用的工厂模式实现的需求
一般说完这些,面试官会感觉,这小伙子工作中学了点东西嘛可以可以!
嘿嘿,你正准备放松一下,这时面试官有往下追问了:能说下具体的细节吗?
你说,这特么我咋知道啊!哈哈哈,我特么也是临时背的啊,没实践过啊!喵的!(打住,别慌,别语无伦次,正所谓,**他有张良计,我有过墙梯嘛!**哈哈哈~)
问到这一步,我们就要根据代码来说了,这段实战代码若初看不怎么会的,我推荐手敲一遍!!!(看看我都敲三个感叹号了啊)
Spring
框架实现)结合上面我们所说的模块案例:支付业务
我们定义一个支付服务,里面包含一个支付方法
/**
*子模块: 高维炫彩眼镜支付服务
*/
public interface GlassesPayService{
//定义一个支付方法
public void pay(GlassesPayRequest glassesPayRequest);
}
/**
*此类定义请求的方法
*/
public class GlassesPayRequest{
}
这个抽象服务类: 目的是把所有支付渠道中的公共代码抽取出来,(亦是模板方法的体现)
定义整体的支付逻辑
仔细看代码里面的解说!
//实现接口,目的实现pay方法
public abstract class AbstractGlassesPayService implements GlassesPayService{
//这个里面很重要,pay定义了整体的支付逻辑(也就是我们上面所说的大框架)
@Override
public void pay(GlassesPayRequest glassesPayRequest){
//支付前的检查
preCheck(glassesPayRequest);
//核心逻辑,抽象再此(For wechat,Alipay....等具体业务实现,留给具体的实现类处理)
doPay(glassesPayRequest);
//支付后处理
postHandle(glassesPayRequest);
}
//抽象方法,子类需要去实现的
public abstract void doPay(GlassesPayRequest glassesPayRequest);
private void preCheck(GlassesPayRequest glassesPayRequest){
//这里面是支付前的检查,保障支付的安全,防止盗刷
...
}
private void postHandle(GlassesPayRequest glassesPayRequest){
//这里面是支付成功后的处理,比如积分啦,还有其他的抽奖等巴拉巴拉
...
}
}
好了,上面的主体我们已经定义完成,我们继续往下敲
这玩意儿我还是比较推荐的,对于有大量的
if-else
的场景,不管重构还是锻炼自己都是挺爽的
支付宝策略服务
@Service
public class GlassesAliPayService extends AbstractGlassesPayService{
//实现方法
@Override
public void doPay(GlassesPayRequest glassesPayRequest){
//AliPay 支付逻辑
}
}
微信策略服务
@Service
public class GlassesWeCahtPayService extends AbstractGlassesPayService{
//实现方法
@Override
public void doPay(GlassesPayRequest glassesPayRequest){
//WeChat 支付逻辑
}
}
央行卡策略服务
@Service
public class GlassesBankPayService extends AbstractGlassesPayService{
//实现方法
@Override
public void doPay(GlassesPayRequest glassesPayRequest){
//央行卡 支付逻辑
}
}
不是东厂也不是西厂,就是特么的工厂,干嘛的? 当然是用来统一管理策略服务的啦!~
我们定义了一个MAP: 用来将所有的用到的策略服务全部注入我们定义的
glassessPayServiceMap
中当我们需要用的时候,直接调用
getGlassesPayService()
方法就可以啦!~
@Service
public class GlassesPayServiceFactory{
@Autowired
public Map<String,GlassesPayService> glassessPayServiceMap=new ConcurrentHashMap<>();
public GlassesPayService getGlassesPayService(String glassesPayChannel){
//eg: AliPay + "PayService" -> AliPayPayService
return glassessPayServiceMap.get(glassesPayChannel+"PayService");
}
}
好了,到此我们在Spring框架的基础上,采用模版方法,策略模式,工厂方法模式实现了我们子啊工作一个使用的场景!~
完结撒花!~