大话设计模式
字体: 16 + -

第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:“嘿嘿!不错喔!”