在很多应用场景中,都需要做到资源的可配置化管理。一般的方法是采用简单键值映射的方式。但对于多属性匹配的需求,这种映射方式使得程序对匹配失败条件的认定相当死板,代码的通用性和重用性都很差。
请看一个2个字段的资源映射匹配需求:
1. 先根据大类匹配,再根据小类匹配。
2. 如果大类匹配失败,读取系统默认资源;如果大类匹配成功,小类匹配失败,读取大类默认资源;
先用简单映射方式实现配置和解析:(假设有2种大类,每种大类下各有2个小类;并用伪代码进行解析)
<root>
<node 大类=“T1” 小类=“t1” 资源=“resource1_1”/>
<node 大类=“T1” 小类=“t2” 资源=“resource1_2”/>
<node 大类=“T2” 小类=“t1” 资源=“resource2_1”/>
<node 大类=“T2” 小类=“t1” 资源=“resource2_1”/>
<node 大类=“T1” 资源=“resource1”/>
<node 小类=“t1” 资源=“resource2”/>
<node 资源=“resource0”/>
</root>
要取得各种情况下的资源至少要做2次if-else判断。解析代码如下:
function getResoure1(param_1, param_2):String{
var 资源="";
If(node.(@ 大类==param_1&&@小类== param_2)!=null){
资源=node.@资源;
}else if(node.(@ 大类==param_1&&@小类!= param_2)!=null){
资源=node.@资源;
}else{
资源=node.@资源;
}
return资源;
}
可以想象如果是n个字段的匹配,至少要写n-1次的if判断。方法getResoure1无法重用,而且写的很难看。
树状的数据结构可以很好地解决这个问题。
<root 资源=“resource0”>
<node value=“T1” 资源=“resource1”>
<node value=“t1” 资源=“resource1_1”>
</node>
<node value=“t2” 资源=“resource1_2”>
</node>
</node>
<node 大类=“T2” 资源=“resource2”>
<node value=“t1” 资源=“resource2_1”>
</node>
<node value=“t2” 资源=“resource2_2”>
</node>
</node>
</ root >
解析代码如下:
function getResoure2(param:Array):String{// param为参数数组
var 资源=""
xml=root
for(var i=0;i<param.length;i++){
if(xml.node.(@value==param[i])){// xml.node是取xml的node子节点
xml= xml.node[0]
}else{
break;
}
}
资源=xml.@node
return 资源;
}
树形结构可以逐层循环匹配,所以无论需要匹配多少字段都需要修改代码,方法getResoure2可重用。