登陆注册
8183300000034

第34章 3 结构图

大B:“下面是组合模式的结构图。”

大B:“组合模式为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理组合模式的子部件。”

abstract class Component

{

protected string name;

public Component(string name)

{

this。name=name;

}

public abstract void Add(component c);//通常都用Add和Remove方法来提供增加或移出树叶或树枝的功能

public abstract void Remove(Component c);

public abstract void Display(in depth);

}

Leaf在组合中表示叶节点对象,叶节点没有子节点

class Leaf:Component

{

public Leaf(string name):base(name)

{}

public override void Add(Component c)

//由于叶节点没有再增加分枝和树叶,所以Add和Remove方法实现

{

Console。WriteLine(“Cannot add to a leaf”);

//它没有意义,但这样可以消除叶节点和枝节点对象在抽象层次的区别

}//它们具备完全一致的接口

public override void Remove(Component c)

{

Console。WriteLine(“Cannot remove to a leaf”);

}

public override void Display(int depth)

{

//叶节点的具体方法,此处是显示其名称和级别

Console。WriteLine();

}

}

Composite定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作,比如增加Add和删除。

class Composite:Component

{

private List《Component》children=new List《Component》();

public Composite(string name):base(name)

{}

public override void Add(Component c)

{

children。add(c);

}

public override void Remove(Component c)

{

children。Remove(c);

}

public override void Display(int depth)

{//显示枝节点名称,并对其下级进行遍历

Console。WriteLine(new string(‘-’,depth) name);

foreach(Component component in children)

{

component。Display(depth 2);

}

}

}

客户端代码,能通过Component接口操作组合部件的对象

static void Main(string[]args)

{

Component root=new Component(“root”);

root。Add(new Leaf(“Leaf A”));//生成树根root,根上长出两叶

root。Add(new Leaf(“Leaf B”));//LeafA与。

Composite comp=new Composite(“Componsite X”);

comp。Add(new Leaf(“Leaf XA”));

comp。Add(new Leaf(“Leaf XB”));

root。Add(comp);

Composite comp2=new Composite(“Composite XY”);

comp2.Add(new Leaf(“Leaf XYA”));

comp2.Add(new Leaf(“Leaf XYB”));

comp。Add(comp2);

//根部又长出两页LeafC和LeafD,可惜LeafD没有长牢,被风吹走了

root。Add(new Leaf(“Leaf c”));

Leaf leaf=new Leaf(“Leaf D”);

root。Add(leaf);

root。Remove(leaf);

root,Display(1);//显示大树的样子

}

显示结果:

root

――leaf A

――leaf B

――Composite X

――Leaf XA

――Leaf XB

――Composite XY

――Composite XYA

――Composite XYB

――Leaf c

大B:“现在你能用代码以组合模式,试写一下我给我女朋友买生日礼物。”

小A:“OK”

代码:

using System;

using System。Collections。Generic;

using System。Text;

namespace Composite

{

interface IGift

{

void Pay();

void Add(IGift gift);

}

class GiftSingle:IGift

{

private string mname;

public GiftSingle(string name)

{

mname=name;

}

public void Add(IGift gift)

{

}

public void Pay()

{

Console。WriteLine(“我买了” mname “!hoho~”);

}

};

class GiftComposite:IGift

{

private string mname;

List《IGift》mgifts;

public GiftComposite()

{

mname=string。Empty;

mgifts=new List《IGift》();

}

public void Add(IGift gift)

{

mgifts。Add(gift);

}

public void Pay()

{

foreach(IGift gift in mgifts)

{

gift。Pay();

}

}

};

class Program

{

static void Main(string[]args)

{

//20岁生日,那时的MM还很单纯~

Console。WriteLine(“lalala~20岁生日来咯――”);

IGift singleGift20=new GiftSingle(“手表”);

singleGift20.Pay();

//22岁生日,MM变得狡诈了~

Console。WriteLine(“heiheihei~22岁生日来咯――”);

IGift compositeGift22=new GiftComposite();

//打包,打包!我要把所有喜欢的礼物打包成“一套”~

compositeGift22.Add(new GiftSingle(“手机”));

compositeGift22.Add(new GiftSingle(“DC”));

compositeGift22.Add(new GiftSingle(“DV”));

compositeGift22.Pay();

//24岁生日……天哪!

Console。WriteLine(“hiahiahia~24岁生日来咯――”);

//先逛商场一层~买化妆品!

IGift compositeGift24=new GiftComposite();

//打包,打包!

compositeGift24.Add(new GiftSingle(“香水”));

compositeGift24.Add(new GiftSingle(“指甲油”));

compositeGift24.Add(new GiftSingle(“眼影”));

//然后来到二层,看中了一套衣服~

IGift singleGift24=new GiftSingle(“衣服”);

//因为只能买“一件”,所以“狡诈”的MM再次打包……

IGift totalGifts=new GiftComposite();

//我包,我包,我包包包!

totalGifts。Add(compositeGift24);

totalGifts。Add(singleGift24)。

totalGifts。Pay();

}

}

}

大B:“嘿嘿!不错喔!”

同类推荐
  • 计算机网络技术与应用

    计算机网络技术与应用

    本书共8章,系统地介绍了计算机网络的发展和基本原理体系结构、局域网、广域网、网络服务、网络安全、典型网络的结构特点等内容。除第8章外,其他各章都附有练习题。为了加强学习效果,本书围绕知识点的典型性,精选了6个实验。此外,在本书的第8章,我们综合各章知识设计了“办公局域网组建设计”和“中小型企业局域网组建设计”这两个常用的计算机网络技术应用实例,供学生学习和参考。本教材适合作为本科非计算机专业学生的计算机网络教材。
  • 多媒体技术

    多媒体技术

    多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术多媒体技术
  • 《Internet实用技术》作业集

    《Internet实用技术》作业集

    随着计算机应用的普及和社会信息化水平的提高,Internet已走进我们的生活。《Internet实用技术》这门课将带领我们走进网络的神秘殿堂,让我们认识网络,了解网络,进而学会使用网络,维护网络。其范围涵盖了在授课过程中所讲授的内容,题型多样,内容丰富,并附有两套模拟题,最后附有答案。学生可按照课程进度做习题来巩固和掌握知识。本作业集由李琳编写,由西北工业大学网络教育学院负责组稿和审定。因为时间仓促,水平有限,错误和不当之处在所难免,敬请读者批评指正。
  • 微软360度

    微软360度

    本书是由微软总部华人协会组织编写的第二本书,是《微软360度——企业和文件》一书的姐妹篇,本书将着重向你呈现微软总部的华人专家是如何一步一步地走向成功的及在微软总部成功的心路历程,以及如何应对挑战,揭示了微软成功的最重要秘密之一——人才至上,读者读后收获更多的是这些成功人士的成功经验,从而为自己的成功做出更好的规划。就让我们一起通过此书来看看微软公司人才至上管理的方方面面,聆听微软的心声,感觉微软的脉动吧。
  • 悟道:一位IT高管20年的职场心经

    悟道:一位IT高管20年的职场心经

    本书是一位有20多年职场经验的IT企业高管撰写的一系列有关职场悟道的短文集成,讲述的是在企业里如何修炼自己,如何摆平自己的心态,怎样做到“世事洞明”和“人情练达”,如何“搞定老板”,怎样做到工作和生活平衡等诸多话题,涉及到跳槽、转行、升迁、环境、沟通、老板、下属、老外等等。每一篇都以作者的亲身经历或者身边的故事说明道理,语言简洁流畅,妙趣横生,更有不少经典片段和发人深省的职场警句,读起来就像是一个睿智幽默的老朋友坐在你面前娓娓道来。
热门推荐
  • 穿越红楼之贾探春

    穿越红楼之贾探春

    她是世家女,在家里被众多控严防死守下,单蠢过了好几年,在三哥戏谑想要看好戏的眼神下接受一本外表名著内里穿越小说的生日礼物,从此,爱好穿越一发不可收拾,学各种技艺,焚香祷告费尽心思要求穿越。终于得偿所愿,一朝穿越成为红楼中的刺玫瑰贾探春,开始了穿越人士的生活!--情节虚构,请勿模仿
  • 我有一缕玄气

    我有一缕玄气

    秦昀原本只是一个普通的学生,在十八岁生日当晚,一团神秘的气体进入了体内。超强的记忆力和强悍的力气,皆是这气体的所带来的增益。暴风雨前的风平浪静,充斥着整个校园。而在这背后,是一个滔天的阴谋……
  • 愿相思:锦瑟流年

    愿相思:锦瑟流年

    她,自幼长于母亲与外婆身边,父亲是谁,她从不知道。他,生于诸侯之家,半生拂过美人色,终是倾倒在她的裙下。阡阡雨巷,微微花落。又是谁乱了谁的流年?
  • 瑾屿

    瑾屿

    西城阁楼上衍珝一妖媚红衣,眉间朱砂一点,妖魅万千,折扇轻启颜面问到:“公子,并非貌丑,那么为何而来?”“为红颜绝色”店前俞氼邪魅一笑,背后出来一个……
  • 我是茅山的巫义

    我是茅山的巫义

    他,巫义,跟随师傅学玄术,除邪崇。历经千难万险,救了一次次人,但却被一个个奸人陷害。危险的水亭湖,骇人的学校,神秘的老塔-----看跪义如何斩妖除魔,祭尸卫道!
  • EXO之虐心之恋

    EXO之虐心之恋

    原先的那个,不是我发的,这本小说是我发的,这里讲边伯贤,朴灿烈,鹿晗,他们几个人之间的爱情是默默的守护还是将她变成我一个人的
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 斩翅

    斩翅

    她,只想安稳生活,命运却兜兜转转,逼着人生的路走向黑暗的边缘,爱过、恨过、抢夺过,到头才发现对的人就在身边,不是遥不可及,而是靠的太近只能被她灼伤。他,那么对她不屑一顾,那么沉痛的折磨着只想要一方平安的她,他的猜忌,他的阴损都只为和不公的命运抗争,只为求得一个人生的真相。作为没有羽翼的天使,他从不知道他的出现,会改变她一生的命运,也带着自己走向另一番痛并爱着的路途。
  • 师傅太喜欢我怎么办

    师傅太喜欢我怎么办

    玩和平精英的洛七,自认为自己非常厉害,但在那些大神面前,却是分分钟被秒杀的存在。有天心血来潮被虐的体无完肤的她在世界呼喊——菜鸡一枚,找师傅~立马来了组队邀请,洛七点了同意。某人:找师傅洛七:嗯嗯,可以带我上分带我飞吗?某人:可以洛七:太好了,我第一次给人当徒弟,没有经验,你多担待某人:我也第一次当师傅,也没经验————洛七:师傅师傅这里有98K,给你给你洛七:师傅师傅这里有医疗箱,给你给你洛七:师傅师傅这里有三级头,给你给你某人:徒弟,我还想要一个东西,你给吗?洛七:什么呀,放心师傅,只要是我有的,我都给你某人:你的心【甜宠文,1V1】
  • 时光旅行者

    时光旅行者

    穿梭时空,改变命运,梦幻现实,塑造传奇人生!PS:各位大老爷,上善新书历史大商人已经发布,拜求各位大老爷的支持,感激不尽!