【发布时间】:2014-09-17 23:35:05
【问题描述】:
从高层的角度来看,该模式可以在不创建类层次结构的情况下获得多态行为。
它由三部分组成:
-
数据容器类,有特定的字段需要区分(例如:用户类有
country字段,或多租户saas项目中任何有tenant字段的类)。 上下文类:这些类包含的数据和逻辑因不同类型的数据容器而异(例如,不同租户的不同逻辑)。有一个顶级 Context 类,所有不同的 props 都设置为默认值,以及多个覆盖默认值的派生类。
数据消费者/处理器:这些是业务逻辑持有者。它们接受数据容器和上下文作为参数。
第三类公民可能有这样的方法:
Price getPrice(Price price, Context context) {
double VAT = context.getVAT()
return new Price(
transform(price.amount + price.amount * VAT, price.currency, context.currency),
context.currency
)
}
...
//and here's the call:
Context ctx = getContext(principal.getCountry())
Price priceInUserCurrency = priceCalculator(priceInUsd, ctx);
这是一个简化的 UML 图:
基本用法:当我们需要为同一类的小对象引入不同的特定行为时,
我们向Context 添加了一个具有合理默认值的新方法,并在具体上下文中实现实际逻辑。然后无论我们需要在哪里注入这段逻辑,我们只需调用对应的上下文方法。
【问题讨论】:
-
基于地区的货币/价格计算器难道不是一种策略模式吗?
标签: oop design-patterns