一、场景假设
某天,业务人员发来一个任务:
设计一个可以灵活配置的营销活动,具体有三种达标规则:
规则A :今日消费单笔满20元
规则B :今日在合作商户有一笔消费
规则C : 客户属于中高端客户
这些规则可以任意组合,用来生成一个营销活动。
比如,第一个月的活动中,只要客户满足规则A就可以参与抽奖;
而在第二个月,满足规则A或规则C的客户都可以参与抽奖。
二、思路设计
根据业务需求,我们需要让活动支持灵活配置不同的规则。
客户的每笔交易经处理后应该带上三个标识字段即A_Flag、B_Flag、C_Flag。
当标识字段为0时,表示该规则未达标。
当标识字段为1时,表示该规则达标。
我们要根据这些标识来判断客户是否满足活动的规则:
-
首先从规则表中获取当前活动的有效规则;
-
然后对客户每笔交易进行检查,如果符合活动要求的所有规则都达标,就认为客户满足条件。
三、参考案例
3.1 知识铺垫--位运算
计算机中数据都以二进制形式存储,即 0 和 1 两种状态。
对二进制数据进行的运算被称为位运算[1]。
(1) 位运算 "或"
特点:只要有一个为1,其值为1。
比如2(对应的二进制形式0010)和4(对应的二进制形式0100),两者进行"或"运算后对应的结果为6。
(2) 位运算 "与"
特点:只有两位同时为1时,结果才为1,否则结果为0。
比如2和4进行"与"运算后对应的结果为0。
3.2 Linux系统中的文件权限管理
在Linux系统中,每个文件都有不同的权限,比如读、写和执行。
这些权限可以用二进制数字表示。
r(读): 100
w(写): 010
x(执行): 001
通过对三种权限进行灵活组合(即进行 "或" 位运算操作),就可以配置多种权限。
比如可通过以下命令,让用户user1对文件 test.txt 拥有全部的操作权限。 (注:命令"700"中的第一个"7"代表user1的权限)
chmod 700 test.txt
四、具体代码设计
4.1 规则设计(枚举类,Java语言)
public enum RuleType {
//此处定义了三种规则作为示例,它们可以扩展为更多的规则
RULE_A(0b1), // 二进制表示,等于十进制的1
RULE_B(0b10), // 二进制表示,等于十进制的2
RULE_C(0b100); // 二进制表示,等于十进制的4
int type;
RuleType(int type) {
this.type=type;
}
public int getType(){
return type;
}
}
4.2 结果验证
(1) 先从配置表中拿出本次活动生效的规则,经过 "或"运算后结果记为X
int X = (rule_A_Exists ? RULE_A.getType():0)
| (rule_B_Exists ? RULE_B.getType():0)
| (rule_C_Exists ? RULE_C.getType():0)
注:(a?b:c)为三元运算符,意思是a如果成立则取b否则取c.
(2) 将客户消费记录中的规则标识字段值进行"或"运算, 结果记为Y
int Y = (A_Flag == 1 ? RULE_A.getType():0)
| (B_Flag == 1 ? RULE_B.getType():0)
| (C_Flag == 1 ? RULE_C.getType():0)
(3) 将 X与Y 进行 "与"运算后再判断结果是否等于X
String result = ( (X&Y)==X ?"达标":"不达标" )
注:只有X和Y相等,进行"与"操作后才能等于X。
五、参考资料