说起设计模式,可能很多开发小伙伴的印象是-一个牛逼的东西,我这里直接引用百度百科的解释:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。-百度百科
在互联网高速发展的8102年,由于短信验证具有操作简单、时效性强等优点,各类应用对短信的应用也越来越普遍,登录可以用短信验证码、付款可以用短信验证码、找回密码也可以用短信验证码……如果验证码短信应用不当,很有可能被不法分子利用,引起短信轰炸、短信诈骗等不法行为;同时,也将为公司或个人造成金钱损失。
接下来,我将以我在S项目做过的一个短信防刷机制为例,说说设计模式的实际应用。
设计思路
首先,我们需要一个发送短信的校验器,在用户请求短信时,校验用户的行为是否符合业务逻辑(比如:需要通过图形验证码校验、一个手机号一天最多发送N条短信、一个手机号发送短信时间间隔为S秒等),当用户行为符合业务逻辑时,发送验证码,否则,不发送。
+设计模式
在S项目中,由于发送短信的位置有5、6个,而且每个发送短信的业务代码还不太一样,所以,如果需要使用短信验证的校验器,需要在每个发送短信的位置添加这些校验器;而且,随着时间的推移,校验器的数量有可能增加(比如:时间间隔校验器)。
我们可以发现分校验器可以合并到一个总校验器里面,用各个校验器的结果,得到总校验器的结果,只把总校验器暴露给发送短信功能。所以这里我们可以使用外观模式。
不难看出这些校验器都可以抽象为入参含有手机号,出参为校验成功或失败的方法,只是在发送短信的时候,使用总校验器,在总校验器里面使用分校验器。我们可以抽象出一个校验接口,总校验器和各分校验器实现这个接口,在不同的地方使用不同的实现,使用策略模式。
在发送短信的位置,注入总校验器;在总校验器里面,注入各个分校验器。
S项目直接使用 “&&” 计算总校验结果。
在S项目的校验器业务逻辑中,我发现在几个校验器中都用到了同一段逻辑“L”:
1、获取缓存中的次数
2、如果缓存中没有次数,设置为1
3、如果缓存中有次数,自增1
如果每个校验器中都写一段,那么将会造成代码冗余。这里我把这段方法放到了实现校验接口抽象类的方法中,然后各个校验器继承这个抽象方法,就可以在需要逻辑“L”的地方直接使用父类的代码,使用模板模式