在做mes系统的时候,有个需求是根据车辆品牌生成不同规则的VIN号,也就是每一辆车的身份证号,相当于ID。
目前是只有两个品牌,为了扩展性和灵活性避免很多的if...else...。可以采用策略模式进行优化。
原来这样实现:
public String getVin(String brand){
if(brand.equals("A")){
//生成A品牌的VIN号
}else if(brand.equals("B"){
//生成B品牌的VIN号,规则和A不同
}
//...
//...
}
现在可以这样实现:
先定义一个接口VinProduct:
public interface VinProduct{
public String getVin();
}
定义两个类实现该接口,分别生成各自规则的Vin号:
public class AVinImpl implements VinProduct{
public String getVin(){
//生成A品牌的VIN号
}
}
public class BVinImpl implements VinProduct{
public String getVin(){
//生成B品牌的VIN号
}
}
配置对应的 properties:
A=com.mes.product.AVinImpl
B=com.mes.product.BVinImpl
读取properties文件,讲key和value放入map中:
Map<String,Object> map =new HashMap<>();
map.put("A", AVinImpl);
map.put("B", BVinImpl);<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
然后就可以这样实现:
public String getVin(String brand){
(VinProduct) product=(VinProduct)map.get(brand);//拿到策略类接口
//生成VIN
String string=product.getVin();
return string;
}
假如现在增加C品牌的车辆生成Vin号的规则也不同,那么只需要增加一个类实现VinProdcut接口,然后实现自己的生成Vin的方法,然后进行配置,就可以通过传不同的参数,反射不同的实现类,进行各自不同的生成Vin号的方法了。