您的位置:首页 > 理论基础 > 数据结构算法

树状结构在资源映射配置上的应用

2009-03-12 15:22 232 查看
 

在很多应用场景中,都需要做到资源的可配置化管理。一般的方法是采用简单键值映射的方式。但对于多属性匹配的需求,这种映射方式使得程序对匹配失败条件的认定相当死板,代码的通用性和重用性都很差。
   请看一个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可重用。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息