合成模式的意思是说用一个对象加载另外一个对象进来而形成的,非常适合树型结构,也很类似链表结构
下面举一个我写的javascript的treeview做例子
var treebase = {
rootnum : 0
};
function treeview(nodetxt,nodehref,nodetag){
this.childNodes=[];
this.txt=nodetxt;
if(nodehref==null)
this.href="";
else
this.href=nodehref;
this.target=nodetag;
if(this.parentNode==null)
{
this.id="root_"+treebase.rootnum;
treebase.rootnum=treebase.rootnum+1;
}
}
treeview.prototype.toString=function(){
var str="<div>";
var c_node=this;
while(c_node.parentNode)
{
str=str+"1";
c_node=c_node.parentNode;
}
if (this.childNodes.length!=0)
{
if(this.href.length>0)
str=str+"<a href='"+this.href+"' target='"+this.target+"' οnclick=/"javascript:showdiv('"+this.id+"_child')/">"+this.txt+"</a>";
else
str=str+"<a href=/"javascript:showdiv('"+this.id+"_child')/">"+this.txt+"</a>";
}
else
{
if(this.href.length>0)
str=str+"<a href='"+this.href+"' target='"+this.target+"'>"+this.txt+"</a>";
else
str=str+this.txt;
}
if (this.childNodes.length!=0)
{
str=str+"<div style=/"display:none;/" id=/""+this.id+"_child/">";
//var save_pos=new Array();
// save_pos.add(this.id);
for(var int_len=0;int_len<this.childNodes.length;int_len++)
{
//save_pos.push(this.id,int_len);
str=str+this.childNodes[int_len];
//int_len=save_pos.find(this.id);
}
str=str+"</div>";
}
str=str+"</div>";
return str;
}
function showdiv(div_id){
var obj_id=document.getElementById(div_id);
obj_id.style.display=(obj_id.style.display=='none'?'block':'none');
}
treeview.prototype.add=function(node){
node.parentNode=this;
this.childNodes[this.childNodes.length]=node;
if (node.childNodes.length==0)
{
node.id=this.id+"_child"+this.childNodes.length;
}
if(node.target==null){
node.target=this.target;
}
}
这里就是用parentNode记录当前对象而形成了一个双链结构
用的时候
var node1=new treeview("node1");
var node2=new treeview("node2");
node1.add(node2);
document.write(node1);
这样就可以了