大B:“下面是组合模式的结构图。”
大B:“组合模式为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理组合模式的子部件。”
abstractclassComponent
protectedstringname;
publicComponent(stringname)
=name;
publicabstractvoidAdd(ponentc);//通常都用Add和Remove方法来提供增加或移出树叶或树枝的功能
publicabstractvoidRemove(Componentc);
publicabstractvoidDisplay(indepth);
Leaf在组合中表示叶节点对象,叶节点没有子节点
classLeaf:Component
publicLeaf(stringname):base(name)
{}
publicoverridevoidAdd(Componentc)
//由于叶节点没有再增加分枝和树叶,所以Add和Remove方法实现
(“Cannotaddtoaleaf”);
//它没有意义,但这样可以消除叶节点和枝节点对象在抽象层次的区别
}//它们具备完全一致的接口
publicoverridevoidRemove(Componentc)
(“Cannotremovetoaleaf”);
publicoverridevoidDisplay(intdepth)
//叶节点的具体方法,此处是显示其名称和级别
Composite定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作,比如增加Add和删除。
classComposite:Component
privateList《Component》children=newList《Component》;
publicComposite(stringname):base(name)
{}
publicoverridevoidAdd(Componentc)
(c);
publicoverridevoidRemove(Componentc)
(c);
publicoverridevoidDisplay(intdepth)
{//显示枝节点名称,并对其下级进行遍历
(newstring(‘-’,depth)+name);
foreach(Componentponentinchildren)
(depth+2);
客户端代码,能通过Component接口操作组合部件的对象
staticvoidMain(stringargs)
Componentroot=newComponent(“root”);
(newLeaf(“LeafA”));//生成树根root,根上长出两叶
(newLeaf(“LeafB”));//LeafA与。
Compositep=newComposite(“ComponsiteX”);
www.youxs.org(newLeaf(“LeafXA”));
www.youxs.org(newLeaf(“LeafXB”));
(p);
Compositep2=newComposite(“CompositeXY”);
www.youxs.org(newLeaf(“LeafXYA”));
www.youxs.org(newLeaf(“LeafXYB”));
www.youxs.org(p2);
//根部又长出两页LeafC和LeafD,可惜LeafD没有长牢,被风吹走了
(newLeaf(“Leafc”));
Leafleaf=newLeaf(“LeafD”);
(leaf);
(leaf);
root,Display(1);//显示大树的样子
显示结果:
root
——leafA
——leafB
——CompositeX
——LeafXA
——LeafXB
——CompositeXY
——CompositeXYA
——CompositeXYB
——Leafc
大B:“现在你能用代码以组合模式,试写一下我给我女朋友买生日礼物。”
小A:“OK”
代码:
usingSystem;
namespaceComposite
interfaceIGift
voidPay;
voidAdd(IGiftgift);
classGiftSingle:IGift
privatestringmname;
publicGiftSingle(stringname)
mname=name;
publicvoidAdd(IGiftgift)
publicvoidPay
(“我买了”+mname+“!hoho~”);
};
classGiftComposite:IGift
privatestringmname;
List《IGift》mgifts;
publicGiftComposite
mname=;
mgifts=newList《IGift》;
publicvoidAdd(IGiftgift)
(gift);
publicvoidPay
foreach(IGiftgiftinmgifts)
}
};
classProgram
staticvoidMain(stringargs)
//20岁生日,那时的MM还很单纯~
(“lalala~20岁生日来咯——”);
IGiftsingleGift20=newGiftSingle(“手表”);
//22岁生日,MM变得狡诈了~
(“heiheihei~22岁生日来咯——”);
IGiftpositeGift22=newGiftComposite;
//打包,打包!我要把所有喜欢的礼物打包成“一套”~
(newGiftSingle(“手机”));
(newGiftSingle(“DC”));
(newGiftSingle(“DV”));
//24岁生日……天哪!
(“hiahiahia~24岁生日来咯——”);
//先逛商场一层~买化妆品!
IGiftpositeGift24=newGiftComposite;
//打包,打包!
(newGiftSingle(“香水”));
(newGiftSingle(“指甲油”));
(newGiftSingle(“眼影”));
//然后来到二层,看中了一套衣服~
IGiftsingleGift24=newGiftSingle(“衣服”);
//因为只能买“一件”,所以“狡诈”的MM再次打包……
IGifttotalGifts=newGiftComposite;
//我包,我包,我包包包!
(positeGift24);
(singleGift24)。
}
大B:“嘿嘿!不错喔!”