为什么在复合模式中透明度比安全性更重要?

2024-02-29

我刚刚了解到复合图案 https://sourcemaking.com/design_patterns/composite。据我了解,其背后的主要思想是统一处理树的边和节点。这意味着结构的“透明度”比“安全性”更有价值,导致我们得到这样的结果:

我理解这个概念,但想不出在什么情况下为了透明度而牺牲安全会是一个不错的选择。换句话说,在什么情况下我们如此需要透明度以至于我们愿意做出如此重大的牺牲?


更准确地说,在复合模式的一些讨论中,包括四人帮的原始描述,透明度比安全性更重要。但四人帮的描述认识到了这种权衡,并且其他有影响力的讨论更支持安全 http://c2.com/cgi/wiki?CompositePattern。无论如何,这是透明度的情况:

安全性(仅在 Composite 中声明不适用于 Leaf 的方法)有成本:

  • 安全组件树的客户端需要在遍历树时检查每个组件是否是复合组件(可能使用 GoF 书第 168 页上所示的外部多态性技术)。要么树的每个客户端都需要实现此检查,要么如果在访问者或类似对象中提供检查,则需要处理这种复杂性。

  • 组件实现者需要选择每个组件是叶组件还是复合组件,如果改变选择,则需要更改代码。

“透明度”(Leaf 和 Composite 的一致性,即在 Component 中声明所有树操作方法)的价值在于最小化安全成本。

如果满足以下任一条件,透明度就会变得更有价值:

  • 叶子很少见或根本不存在。例如,在 UI 工具包中,可以将子组件添加到任何组件(甚至是通常对子组件几乎没有用处的组件,例如复选框),并期望它们能够智能地呈现。由此提供的视觉灵活性可能值得开发人员付出额外的努力,否则叶子将是叶子,并且组件中的默认实现可能会最大限度地减少额外的努力。

  • 树的许多用途不需要区分叶子和复合材料。例如,在 UI 工具包中,像绘图这样的操作可以通过迭代每个组件可能为零长度的子组件列表来统一处理叶子和复合组件。

  • 相对于程序的其余部分,具有子级列表的每个组件的运行时(内存和 CPU)成本较低。

如果上述情况属实,那么一致性会带来更多回报:树的客户端需要做更少的事情来使用树,并且这种易用性给客户端带来麻烦的情况很少见。 UI 组件通常会出现这种情况:树的客户端唯一需要担心某些东西是否是 Composite 的时候可能是在他们构建(添加到)树时,此时他们知道什么无论如何,所有具体组件都是如此。

Java Swing 做出了这样的选择:JComponent包括add方法。开发人员只需不要将它们与JComponents不适合儿童,这对于许多组件(同样,例如复选框)来说是显而易见的。

如果出现任何相反的情况,那么区分叶子和复合材料就变得更有价值,并且管理安全树的复杂性变得值得增加。如果叶子是常见的和/或树的许多客户端确实需要区分叶子和复合材料,但类型是“透明”的并且无法进行区分(也许 GoF 应该称此选择为不透明而不是透明),那么客户就更有可能犯错误。如果子级列表太昂贵,那么值得让组件实现者选择每个组件是叶组件还是复合组件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在复合模式中透明度比安全性更重要? 的相关文章

  • 使用类的 __new__ 方法作为工厂:__init__ 被调用两次

    我在 python 中遇到了一个奇怪的错误 其中使用 new 将类的方法作为工厂会导致 init 实例化类的方法被调用两次 这个想法最初是为了使用 new 母类的方法根据传递的参数返回其子类之一的特定实例 而无需在类外部声明工厂函数 我知道
  • 单个 DLL V 多个 DLL

    前段时间我在这里问了一个问题 当时我想知道是否最好将一个大项目 NET 类库 拆分为多个 NET DLL 建议使用一个大的 DLL 该 DLL 现在已在另一个项目中使用 另一个项目只使用了几个类 因此项目中有很多类未使用 从体系结构的角度来
  • C语言中有“设计模式”吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 同步客户端-服务器数据库

    我正在寻找一些通用策略 用于将中央服务器上的数据与并不总是在线的客户端应用程序同步 在我的特定情况下 我有一个带有 sqlite 数据库的 Android 手机应用程序和一个带有 MySQL 数据库的 PHP Web 应用程序 用户将能够在
  • 实体框架:获取存储库中的子类对象

    我有与下面列出的数据库表对应的以下模型 经理就是雇员 会计师也是雇员 让所有管理器都进入存储库的最佳方法是什么 如何实现GetAllManagers 方法 这是正确的TPT吗 CODE MyRepository MyEmployeeRepo
  • 使用 DTO 和 BO

    我对 DTO BO 的疑问之一是何时传递 返回 DTO 以及何时传递 返回 BO 我的直觉告诉我始终将 NHibernate 映射到 DTO 而不是 BO 并且始终传递 返回 DTO 然后 每当我需要执行业务逻辑时 我都会将 DTO 转换为
  • 导航栏是否应该始终以列表的形式实现?

    首先 非常抱歉 如果这不是一个 真正的 stackoverflow 问题 但这是我一直想知道的事情 当您为网站 html 编写导航栏时 我读到这是非常好的实践 即使不是使用列表标签实现它的唯一实践 例如 ul li Home li li A
  • java对象间通信

    还在学习Java Swing 又让我问了这个问题 但这确实是一个普遍的面向对象问题 如果我有一个主类 包含 main 它会创建一个执行某些操作的新对象 A 主类现在具有对该对象的引用 对象 B 如何访问该对象的属性 我能想到的唯一方法是让主
  • 使用多个提供程序的客户端应用程序应使用什么设计/模式?

    这是一个与设计相关的问题 假设我们有一个名为 ClientAPI 的公共 API 其中包含一些 Web 方法 例如 CreateAccount GetAccount 根据客户的不同 我们使用许多不同的提供商来满足这些请求 假设我们有 Pro
  • 使用状态模式设计在Java中实现通信协议

    如果在其他地方回答了这个问题 我们深表歉意 找不到足够的信息来说服自己最好的方法来做到这一点 我还意识到这是一个冗长的解释 没有代码 但是让我知道我是否应该编写一些示例代码来帮助演示我正在做的事情 基本上 使用 System in out
  • 代理模式和装饰者模式的区别

    你能给出任何好的解释吗 Proxy and 装饰者 我看到的主要区别是 当我们假设Proxy uses 作品 and 装饰者 uses 聚合那么似乎很清楚 通过使用多个 一个或多个 装饰器您可以修改 添加功能到预先存在的实例 装饰 而Pro
  • Meyers 的单例实现实际上是如何实现单例的

    我读了很多关于单例的内容 什么时候应该使用它们 什么时候不应该使用它们 以及如何安全地实现它们 我正在用 C 11 编写 并且遇到了 Meyer 的单例延迟初始化实现 如所示这个问题 https stackoverflow com ques
  • 在应用程序中搜索对象的设计模式

    需要一些有关设计模式的帮助 我正在创建一个应用程序 该应用程序在存储在单独表中的数据库中的对象上具有不同类型 例如 我有 5 种对象 A B C D E 我在数据库中有 5 个不同的表来存储每个对象 现在 我想在我的应用程序中实现搜索功能
  • C# 数据库包装设计

    我正在为 C 设计一个数据库包装器 以下是我有两个选择 选项A class DBWrapper IDisposable private SqlConnection sqlConn public DBWrapper sqlConn new S
  • PHP 设计模式

    好的 我想首先让您注意到我一直在寻找 php mvc 设计模式 所以我还没有真正找到我想要的东西 现在 在写我的问题时 我找不到我要问的任何相关且具体的问题 但我知道我可能是错的 无论如何考虑这个问题和一个可能有用的问题包 Question
  • 为什么要分离接口和实现?

    在生产代码中 我经常看到定义如下的类 public interface SomeComponent Some methods public class SomeComponentImpl implements SomeComponent S
  • 是否有用于序列化和反序列化各种格式的对象层次结构的模式?

    给定一个复杂的对象层次结构 幸运的是它不包含循环引用 如何实现支持各种格式的序列化 我不是来讨论实际实施的 相反 我正在寻找可能派上用场的设计模式的提示 更准确地说 我正在使用 Ruby 我想解析 XML 和 JSON 数据以构建复杂的对象
  • 使用 Doctrine2 时的多重歧视级别

    我正在使用 Doctrine2 来管理我的模型 如下 有一个抽象概念Content与复合模式Gallery 也是一个抽象概念Media从中Video and Image继承 我的选择是添加鉴别器Content and Media表以便区分G
  • 三层 Asp.Net 应用程序中的异常处理

    1 据我了解 在three tierAsp Net应用程序我们应该通过以下方式实现异常处理 a 我们应该把try catch围绕代码块 位于三层中的任何一层 我们希望页面能够从该代码块正常恢复 当此代码生成异常时 b 我们不应该放try c
  • 在实现接口的类上强制使用单例模式

    我最好用一个例子来解释这个问题 我有一个接口模型可用于访问数据 模型可以有不同的实现 可以以各种格式表示数据 例如 XMl txt 格式等 Model不关心格式 可以说这样的一个实现是myxml模型 现在我想强迫myxml模型以及其他所有实

随机推荐