- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Composite模式与透明访问聚合约束机制
研究
作者:刘鹏远王得军靳延安
来源:《科技创业月刊》2013年第9期
刘鹏远1王得军2靳延安1
(1湖北经济学院信息管理学院湖北武汉4302052湖北工业大学计算机学
院湖北武汉437000)
摘要:在GoF模式中,Composite复合模式是结构型、对象类型的设计模式。
但经典Composite模式未能较好解决聚合约束的问题。文章提出了一种改进方案,一
方面与透明访问机制结合,使得Composite模式优点能得到最大化利用,另一方面深
入分析了透明访问机制的缺陷,提出了改进的引入聚合约束的整体方法,使得能够在一个统一
的类图中同时表达复杂继承和复杂聚合的逻辑关系。
关键词:GoF模式;Composite模式;聚合约束;透明访问
中图分类号:TP311
文献标识码:A
doi:10.3969/j.issn.1665-2272.2013.09.068
1透明访问机制
继承使得客户能以统一的基类形式访问所有派生类,让客户程序能透明地、无障碍地访问
不同层次的类,这是面向对象语言提供继承机制的主要意图,也是接口替换原则的要求。
图1是一棵与动物相关的透明继承树,在最高层的抽象类“动物”定义了适用于所有动物
的接口,让所有动物都能用一种类型的指针或引用来针对抽象编程。图中“动物”接口定义了
“叫”与“听”两个纯虚函数,“鸟”和“狗”这两种派生子类给予了各自实现。
透明继承树虽然方便了客户使用,但有着几点缺陷:
①显然狗并不会飞,虽然可以对“狗∷飞”设计为输出“对不起,我不会飞”,但本就不
应存在的狗:飞这样的函数,这有职责不清的嫌疑;②如果动物种类较多,而每种动物的特定
行为都抽象出来放到接口中的话,这个抽象类就变得非常庞大。合适的设计是在透明访问和职
责分配间找到平衡,将接口分散到不同层次的抽象类中去,形成图2所示的职责清晰的继承树。
2标准Composite模式
当一个系统中的对象需要组合成树形结构以表达整体与部分的层次关系时,就可以使用C
omposite复合模式。在复合模式的继承树中,叶子对象在整体和部分的聚合关系中是
简单的被聚合对象,复合(Composite)对象则可以聚合该集成树上任何非抽象类的
对象实例,从这个角度来说,复合模式是一种自己包含自己的递归结构。
图3给出了标准Composite模式的结构图:
对Component类,如果它定义有:①add:注册到聚合对象的方法;②rem
ove:从聚合对象卸载的方法;③叶子对象和复合对象其它共有接口。
客户就能通过Component抽象类,透明访问所有的叶子对象和复合对象。但如果
有些类还有着自己的特有方法(非虚方法)时,就只能以本类或派生类(protected
特有方法)的某种形式(指针、引用或对象)而不能使用接口编程访问(protected
访问属性则派生类内部可访问)。
一种错误访问:Component*p=newLeaf();p->leafF
unc1();
错误在于,leafFunc1是Leaf类非虚的特有方法,*p类型中并没有定义该方
法,编译时静态绑定会失败。要想继续访问子类特有方法,应改为:
Component*p=newLeaf();(Leaf*)p->leafF
unc1();
不幸的是,这种类型转换具有一定的运行期风险,再比如:
Animal*p=newDog();(Bird*)p->fly();
p本是指向Dog的指针,但强转为Bird*去访问“飞”的方法,静态编译绑定能通过
(有Bird::fly函数),但会发生运行期错误甚至程序崩溃。换句话说,要强转前,
先明确它是否确实指向一个该类型的对象实例。在运行时判断对象类型以及安全类型转换。
图4和图1本质上一样,将方法都集中定义于Component接口,不同的是有三个
复合类和四个叶子类且各自有着继承层次,每个复合类可聚合其它任意复合对象或叶子对象实
例,因此也是一种可透明访问整棵继承树的透明复合方式,抽象类Component中必须
定义所有派生类需要的方法(或接口),既包括add、remove等与聚合关系相关的方
法,也包括叶子对象和复合对象
文档评论(0)