将复合模式转换为具有附加行为的新模式

Posted

技术标签:

【中文标题】将复合模式转换为具有附加行为的新模式【英文标题】:Convert a Composite Pattern to a new one with additional behavior 【发布时间】:2015-04-25 19:05:02 【问题描述】:

我们的设计有点问题。

我们有一个内部框架,我们在其中使用复合模式来表示分层数据结构:

这个分层数据结构由框架的“读取文件”方法返回给我们的应用程序,也被其他应用程序使用。

现在在我们的应用程序中,我们需要完全相同的数据结构(复合模式),但具有额外的行为:我们需要为每个实体提供一个额外的 GetCompareText() 方法。而且这个方法应该可以在每个实体中定义:

ContainerEntity 应该为“Containers”实现 GetCompareText 方法的默认行为 LeafEntity 应该为“Leaves”实现 GetCompareText 方法的默认行为 某些叶实体可以覆盖行为(例如,LeafEntityA 必须覆盖行为,但 LeafEntityB 必须具有默认行为) 某些 Container 实体可以覆盖默认行为(ContainerEntityA 使用默认行为,当 ContainerEntityB 覆盖它时)。

我们怎样才能做到这一点? 我们的应用程序中是否需要另一个复合模式?装饰器模式是一种选择吗?

希望我说的够清楚

感谢您的帮助!

贝努瓦

【问题讨论】:

是否需要在框架和应用程序之间分离 GetCompareText 行为?您可以在 IEntity 实现对象(从框架返回)中包含 GetCompareText,然后通过它们在应用程序中的接口使用它们。 这是一个选项,但我更愿意将其分开。 GetCompareText 与我们的新应用程序真正相关。而且我认为,使用该框架的其他应用程序不应该知道这种行为。 Decorator 在这种情况下似乎是显而易见的选择?您还可以查看访问者模式,只允许您的特定应用程序访问实体以获取 GetCompareText 行为,但这会为您的设计增加更多层次结构的复杂性?? 好的,我也来看看访客模式。对于装饰器模式,我还不确定我应该如何实现它。然后如何将我的框架对象“转换”为应用程序对象。 您的比较行为是通用的还是每个实体都有不同的实现?如果它是通用的(或变化不大),您可以使用扩展方法来实现您的装饰应用程序端(我假设您使用的是 C#)。 【参考方案1】:

我已经为我的领域模型对象实现了装饰器模式,如下所示:

这个实现是否正确?

为任何实体检索适当的“装饰器”的最佳解决方案是什么(如果存在则返回装饰器的实例,否则返回默认装饰器)?

【讨论】:

以上是关于将复合模式转换为具有附加行为的新模式的主要内容,如果未能解决你的问题,请参考以下文章

7创建型模式之建造者模式

设计模式---对象创建模式之构建器模式(Builder)

对复合(协作)算法/策略的封装方法——装饰模式总结

3,建造者模式(Builder Pattern)

有向加权图的复合模式

将 MyISAM 转换为 InnoDB,其中表具有两列(复合)PK,其中之一是自动增量