强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan
最近业务由一个国家扩展到多个国家,维护的通知平台也要进行相应的扩展;在扩展的时候应用一个技巧使得程序的扩展性大大提高;
一、业务需求
在此以通知平台中短信业务中的校验手机号前缀为例;
1、一个国家(比如:中国),校验手机号是否合法的规则:以86开头为合法;
2、业务扩展增加一个国家(比如:美国),校验手机号是否合法的规则:
(1)国家编码为中国:以86开头为合法;
(2)国家编码为美国:以1开头为合法;
3、如果再增加其他国家则需要再扩充;
二、实现方案
1、第一种实现方案:首先想到的是if判断就ok;相应的代码:
@RequestMapping(value = "/bad/check/mobile", method = RequestMethod.POST)
public Map badCheckMobile(@RequestBody MobileCheckRequest mobileCheckRequest) {
String countryCode = mobileCheckRequest.getCountryCode();
String proFix;
if (countryCode.equals("CN")) {
proFix = "86";
} else if (countryCode.equals("US")) {
proFix = "1";
} else {
return buildFailResponse();
}
String mobile = mobileCheckRequest.getMobile();
Boolean isLegal = false;
if (mobile.startsWith(proFix)) {
isLegal = true;
}
Map map = new HashMap();
map.put("code", 0);
map.put("mobile", mobile);
map.put("isLegal", isLegal);
map.put("proFix", proFix);
return map;
}
private Map buildFailResponse() {
Map map = new HashMap();
map.put("code", 1);
map.put("mobile", "");
map.put("isLegal", false);
map.put("proFix", "");
return map;
}
效果:
2、第二种方案:更优雅的实现方式:
(1)在配置文件中增加配置
mobile.prefixs[CN]=86
mobile.prefixs[US]=1
(2)增加读取配置的类
package com.zhanghan.zhboot.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
@ConfigurationProperties(prefix = "mobile")
@Data
public class MobilePreFixProperties {
// 查询国家所有主体 url
private Map prefixs = new HashMap<>();
}
(3)相应的代码
@Autowired
private MobilePreFixProperties mobilePreFixProperties;
@RequestMapping(value = "/good/check/mobile", method = RequestMethod.POST)
public Map goodCheckMobile(@RequestBody MobileCheckRequest mobileCheckRequest) {
String countryCode = mobileCheckRequest.getCountryCode();
String proFix = mobilePreFixProperties.getPrefixs().get(countryCode);
if (StringUtils.isNullOrEmpty(proFix)) {
return buildFailResponse();
}
String mobile = mobileCheckRequest.getMobile();
Boolean isLegal = false;
if (mobile.startsWith(proFix)) {
isLegal = true;
}
Map map = new HashMap();
map.put("code", 0);
map.put("mobile", mobile);
map.put("isLegal", isLegal);
map.put("proFix", proFix);
return map;
}
(4)效果:
3、比较:
很显然第二种方案比第一种方案更优雅;第一种方案,扩展性就很差,如果以后再扩展其他国家,则需要增加if判断,修改代码发布程序;而第二种方案只需要增加相应的配置文件即可(如果项目连接动态的配置中心如:Apollo,springcloudconfig等,都无需重启项目)。
三、项目地址及代码版本
1、地址:https://github.com/dangnianchuntian/springboot
2、代码版本:1.0.0-Release
1、不断思考程序的可扩展性,不然会被需求累死;
2、不断实践,不断思考。