【发布时间】:2014-06-03 22:14:08
【问题描述】:
假设您有一家工厂,产品在制造过程中通过皮带传送。在这中间的某个地方,有必要根据某些业务逻辑将来自单个传送带输入的产品流拆分到多个传送带上。也许他们需要用红色、绿色和蓝色产品的输出带按颜色分开。也许这是某种简单的负载平衡,因此需要根据每个输出带的百分比来拆分产品。
________________
/ ___Color=Red___...
____________/ /_______________
..._Products___ ____Color=Green_...
\ \_______________
\____Color=Blue__...
或者
__________
/ ___60%___...
____________/ /_________
..._Products___ ____20%___...
\ \_________
\____20%___...
具体来说,我正在尝试对routing functionality of ProModel 进行逆向工程。路由方法应该能够在运行时更改,单个输出“带”的路由属性也应该能够更改(例如更改颜色标准)。如果路由方法切换回之前定义的方法,它会记住使用的设置。
为了使我的代码通用化,产品是“实体”对象,分离带是“路由”对象,内部路由逻辑是“路由规则”,整个输入带/内部逻辑/输出带是一个“路由器”。根据 ProModel 的用法,“RoutingRule”适用于“Router”而不是单个“Routes”——如果规则是 RouteByPercent,那么每个传出的“Route”都应该有一个百分比,而如果它是RouteByAttribute,每个“路线”都会有一个属性/比较器/标准(例如“颜色”、“=”、“蓝色”)来测试传入的“实体”。
我可以看到,使用策略模式可以灵活地支持和交换“RoutingRule”对象(例如 ProModel 链接中可能的规则列表);但是,我不太明白如何在不紧密耦合“RoutingRule”和“Route”对象的情况下存储每个规则的状态信息。
在将策略模式应用于这种情况时,我应该如何存储适用于每个路由的 RoutingRule 特定属性?我正在尝试考虑我的选项,但我不喜欢其中任何一个:
- 天真的方法是在 Route 类中为所有可能的 RoutingRules 设置成员变量:
m_Percent、m_EntityAttribute/m_EntityComparator/m_EntityCriteria... 但由于显而易见的原因,这将是可怕的。每当我添加一种新的 RoutingRule 时,我都必须向 Route 类添加成员变量。 - 我一直计划这样做的方式是使用关联数组(字典或自定义哈希表),因此可以即时添加或删除属性。这通常很好,但是必须有一些代码来 a) 初始化特定于规则的属性 b) 告诉我需要为当前规则设置哪些属性(我不能只提示用户输入所有 Route 属性,因为它们可能不会全部被当前选择的规则使用) c) 验证 Route 属性是否处于一致状态。
- 我能想到的唯一其他方法是将 Route 属性存储在 RoutingRule 本身中,一个关联数组中的关联数组,这样我就可以按名称查找 Route 并获取适用于每个的确切属性的列表当前规则的路由。这种方式解耦最多,但是我不确定如何构造它,以便向 Route 询问其属性是一个透明的过程。而不是像#1 和#2 那样的
Route.Attributes(strAttrName),它更像是RoutingRule.RouteAttributes(Route.Name).Attributes(strAttrName)。 - 也许我想多了?
顺便说一句,我在 VBA 中执行此操作时会受到所有暗示的限制。
【问题讨论】:
-
我很感兴趣,但是@Blackhawk 有什么问题?
-
@ckuhn203 看看我从粗体文本向下的编辑是否有助于澄清我的困惑:(
-
@Blackhawk 我不确定,因为这已经很扭曲了,但也许this solution 可以告诉你如何迭代列表中的属性(第 3 号)?
标签: vba design-patterns modeling strategy-pattern