软件设计与体系结构课件-9组合模式.pptVIP

软件设计与体系结构课件-9组合模式.ppt

此“教育”领域文档为创作者个人分享资料,不作为权威性指导和指引,仅供参考
  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
公司管理系统(续) 职责: 总公司人力资源部 员工招聘培训管理 总公司财务部 公司财务收支管理 华东分公司人力资源部 员工招聘培训管理 华东分公司财务部 公司财务收支管理 南京办事处人力资源部 员工招聘培训管理 南京办事处财务部 公司财务收支管理 杭州办事处人力资源部 员工招聘培训管理 杭州办事处财务部 公司财务收支管理 软件设计与体系结构 组合模式 主讲:李健利 组合模式 意图 =将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式 使客户能够一致地处理单个对象和对象组合。即所谓的递归组合。 动机 组合模式 动机 适用性 以下情况使用组合模式: =你想表示对象的部分-整体层次结构; = 你想要用户能够忽略对象组合与单个对象的差异,用户将一致地处理组合结构中的所有对象。 组合模式 结构 组合模式 组合模式 组合模式 效果 =收益 →使得更容易增加新类型的组件 →使得客户代码更简单,因为客户不必知道他们正在 处理的是叶组件还是组合组件。 =缺陷 →使得更难以限制组合中的组件类型 组合模式 实现问题 =组合对象知道其包含的组件,即它的孩子。组件应维护对其父组件的引用吗? → 取决于应用,但具有这些引用能支持责任链模式 =应该在哪里声明孩子管理方法(add(), remove(), getChild())? → 在Component类中:具有透明性,因为可以一致地处理所有组件。但这种方法并不安全,因为客户有可能会在运行期对叶组件做一些无意义的事情。 → 在Composite类中: 具有安全性,因为任何在叶组件上执行孩子操作的尝试都将在运行期被捕捉。但是这又丧失了透明性,因为叶组件和组合组件具有不同的接口。 组合模式 透明方案 vs. 安全方案 组合模式 实现问题 =Component应该维护将被组合对象使用的组件列表吗?即该列表是否应该是Component 的实例变量而不是Composite 的? → 最好将该部分放在Composite中,避免浪费每个叶对象的空间 =孩子的排序重要吗? → 取决于应用。如果Composite 表示语法分析树, Composite 孩子组件的顺序必须反映程序结构,而组合语句就是这样一些Composite的实例。 =谁应该删除组件? → 在in Java 不成问题!垃圾收集器将完成此任务! =存贮组件最好用哪一种数据结构? → 取决于应用。数据结构的选择取决于效率。 组合模式例 1 情形:GUI系统的窗口对象能够包含各种GUI组件 (窗口部件) ,诸如按钮和文本域。窗口也能够包含窗口部件容器对象,该对象能够容纳其他窗口部件。 解决方案1: 如果我们设计的窗口部件具有不同的“更新”屏幕接口会怎么样?我们将不得不编写下面的窗口update() 方法: public class Window { Button[] buttons; Menu[] menus; TextArea[] textAreas; WidgetContainer[] containers; 组合模式例 1 (续) public void update() { if (buttons != null) for (int k = 0; k buttons.length; k++) buttons[k].draw(); if (menus != null) for (int k = 0; k menus.length; k++) menus[k].refresh(); // Other widgets handled similarly. if (containers != null) for (int k = 0; k containers.length; k++ ) containers[k].updateWidgets(); } ... } 看起来很糟糕。它违反了开-闭原则。如果想要增加新型窗口部件,就必须修改窗口的update() 方法来处理它。 组合模式例 1 (续) 解决方案2: 应总是尝试针对接口编程对吧?所以,让所有的窗口部件都支持Widget 接口,这些部件或者成为Widget类的子类,或者实现Java Widget接口。现在的update() 方法如下: public class Window { Widget[] widgets; WidgetContainer[] containers; public void update() { if (widgets != null) for (int k = 0; k widgets.length; k++) widgets[k].up

文档评论(0)

宋停云 + 关注
实名认证
文档贡献者

特种工作操纵证持证人

尽我所能,帮其所有;旧雨停云,以学会友。

领域认证该用户于2023年05月20日上传了特种工作操纵证

1亿VIP精品文档

相关文档