第34章
大b:“下面是组合模式的结构图。”
大b:“组合模式为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理组合模式的子部件。”
abstractclasscomponent
{
protectedstringname;
publiccomponent(stringname)
{
this.name=name;
}
publicabstractvoidadd(ponentc);//通常都用add和remove方法来提供增加或移出树叶或树枝的功能
publicabstractvoidremove(componentc);
publicabstractvoiddisplay(indepth);
}
leaf在组合中表示叶节点对象,叶节点没有子节点
classleaf:component
{
publicleaf(stringname):base(name)
{}
publicoverridevoidadd(componentc)
//由于叶节点没有再增加分枝和树叶,所以add和remove方法实现
{
console.writeline(“cannotaddtoaleaf”);
//它没有意义,但这样可以消除叶节点和枝节点对象在抽象层次的区别
}//它们具备完全一致的接口
publicoverridevoidremove(componentc)
{
console.writeline(“cannotremovetoaleaf”);
}
publicoverridevoiddisplay(intdepth)
{
//叶节点的具体方法,此处是显示其名称和级别
console.writeline();
}
}
composite定义有枝节点行为,用来存储子部件,在component接口中实现与子部件有关的操作,比如增加add和删除。
classcomposite:component
{
privatelist《component》children=newlist《component》();
publiccomposite(stringname):base(name)
{}
publicoverridevoidadd(componentc)
{
children.add(c);
}
publicoverridevoidremove(componentc)
{
children.remove(c);
}
publicoverridevoiddisplay(intdepth)
{//显示枝节点名称,并对其下级进行遍历
console.writeline(newstring(‘-’,depth)+name);
foreach(componentponentinchildren)
{
ponent.display(depth+2);
}
}
}
客户端代码,能通过component接口操作组合部件的对象
staticvoidmain(string[]args)
{
componentroot=newcomponent(“root”);
root.add(newleaf(“leafa”));//生成树根root,根上长出两叶
root.add(newleaf(“leafb”));//leafa与。
compositep=newcomposite(“componsitex”);
p.add(newleaf(“leafxa”));
p.add(newleaf(“leafxb”));
root.add(p);
compositep2=newcomposite(“compositexy”);
p2.add(newleaf(“leafxya”));
p2.add(newleaf(“leafxyb”));
p.add(p2);
//根部又长出两页leafc和leafd,可惜leafd没有长牢,被风吹走了
root.add(newleaf(“leafc”));
leafleaf=newleaf(“leafd”);
root.add(leaf);
root.remove(leaf);
root,display(1);//显示大树的样子
}
显示结果:
root
——leafa
——leafb
——compositex
——leafxa
——leafxb
——compositexy
——compositexya
——compositexyb
——leafc
大b:“现在你能用代码以组合模式,试写一下我给我女朋友买生日礼物。”
小a:“ok”
代码:
usingsystem;
usingsystem.collections.generic;
usingsystem.text;
namespacecomposite
{
interfaceigift
{
voidpay();
voidadd(igiftgift);
}
classgiftsingle:igift
{
privatestringmname;
publicgiftsingle(stringname)
{
mname=name;
}
publicvoidadd(igiftgift)
{
}
publicvoidpay()
{
console.writeline(“我买了”+mname+“!hoho~”);
}
};
classgiftcomposite:igift
{
privatestringmname;
list《igift》mgifts;
publicgiftcomposite()
{
mname=string.empty;
mgifts=newlist《igift》();
}
publicvoidadd(igiftgift)
{
mgifts.add(gift);
}
publicvoidpay()
{
foreach(igiftgiftinmgifts)
{
gift.pay();
}
}
};
classprogram
{
staticvoidmain(string[]args)
{
//20岁生日,那时的mm还很单纯~
console.writeline(“lalala~20岁生日来咯——”);
igiftsinglegift20=newgiftsingle(“手表”);
singlegift20.pay();
//22岁生日,mm变得狡诈了~
console.writeline(“heiheihei~22岁生日来咯——”);
igiftpositegift22=newgiftcomposite();
//打包,打包!我要把所有喜欢的礼物打包成“一套”~
positegift22.add(newgiftsingle(“手机”));
positegift22.add(newgiftsingle(“dc”));
positegift22.add(newgiftsingle(“dv”));
positegift22.pay();
//24岁生日……天哪!
console.writeline(“hiahiahia~24岁生日来咯——”);
//先逛商场一层~买化妆品!
igiftpositegift24=newgiftcomposite();
//打包,打包!
positegift24.add(newgiftsingle(“香水”));
positegift24.add(newgiftsingle(“指甲油”));
positegift24.add(newgiftsingle(“眼影”));
//然后来到二层,看中了一套衣服~
igiftsinglegift24=newgiftsingle(“衣服”);
//因为只能买“一件”,所以“狡诈”的mm再次打包……
igifttotalgifts=newgiftcomposite();
//我包,我包,我包包包!
totalgifts.add(positegift24);
totalgifts.add(singlegift24)。
totalgifts.pay();
}
}
}
大b:“嘿嘿!不错喔!”