'
def singleButtonCondition = SingleCondition.getInstance(singleCondJson)
def valueMap = ["activity_type": 13]
singleButtonCondition.satisfiedBy(valueMap) == true
singleButtonCondition.getResult() == true
def multiCondJson = '{"conditions": [{"field": "activity_type", "op":"eq", "value": 13}, {"field": "feedback", "op":"gt", "value": 201}], "result": false}'
def multiButtonCondition = MultiCondition.getInstance(multiCondJson)
def valueMap2 = ["activity_type": 13, "feedback": 250]
multiButtonCondition.satisfiedBy(valueMap2) == true
multiButtonCondition.getResult() == false
def buttonConfigJson = '{"buttonRules": [{"cond":{"field": "activity_type", "op":"eq", "value": 63}, "result": false}, {"cond":{"field": "order_type", "op":"eq", "value": 75}, "result": false}, ' +
'{"conditions": [{"field": "state", "op":"neq", "value": 10}, {"field": "order_type", "op":"eq", "value": 0}, {"field": "activity_type", "op":"neq", "value": 13}], "result": true}], "defaultResult": false}'
def combinedCondition = ButtonCondition.getInstance(buttonConfigJson)
def giftValueMap = ["activity_type": 63]
def giftResult = combinedCondition.satisfiedBy(giftValueMap)
assert giftResult == false
def knowledgeva lueMap = ["activity_type": 0, "order_type": 75]
def knowledgeResult = combinedCondition.satisfiedBy(knowledgeva lueMap)
assert knowledgeResult == false
def periodValueMap = ["state": 20, "order_type": 0, "activity_type": 0]
def periodResult = combinedCondition.satisfiedBy(periodValueMap)
assert periodResult == true
def complexValueMap = ["state": 20, "order_type": 0, "activity_type": 13]
def complexResult = combinedCondition.satisfiedBy(complexValueMap)
assert complexResult == false
}
@Unroll
@Test
def "testBaseCondition"() {
expect:
new BaseCondition(field, op, value).test(valueMap) == result
where:
field | op | value | valueMap | result
'feedback' | CondOp.eq | 201 | ['feedback': 201] | true
'feedback' | CondOp.in | [201, 250] | ['feedback': 201] | true
'feedback' | CondOp.gt | 201 | ['feedback': 202] | true
'feedback' | CondOp.gte | 201 | ['feedback': 202] | true
'feedback' | CondOp.lt | 201 | ['feedback': 250] | false
'feedback' | CondOp.lte | 201 | ['feedback': 250] | false
}
支持多种配置语法
以上支持了从JSON串解析按钮逻辑的条件配置。不过用JSON写逻辑表达式,还是有些不够自然,容易出错。如果能用更自然的表达语法就更好了,比如:activity_type=13 && state = 30 , result = true 。 这样需要支持多种配置语法。 可以使用策略模式和工厂模式。 凡是需要多种可替换实现的算法,通常都可以采用策略模式和工厂模式。
STEP1: 定义条件配置的解析策略接口:
package zzz.study.patterns.composite.button.strategy;
import zzz.study.patterns.composite.button.ButtonCondition;
import zzz.study.patterns.composite.button.MultiCon |