巧用设计模式,
打造通用规则模块
在活动业务需求中我们常有一些需求规则如:登录游戏x天、活动期间累计充值x元、角色等级达到x级等等,而这些规则会被不同的功能模块调用如:领取礼包功能、抽奖功能、虚拟积分功能等。组合后就可以实现如下活动规则:登录游戏1天且累计充值1元可领取礼包A、角色等级达到10级可抽奖1次等等。
01

何为通用规则模块?
传统的实现方式如下,每个模块都有自己的规则组合,如(图1)所示:图1
但缺点也比较明显,会有大量重复的规则代码,功能模块与规则逻辑之间有着较强的耦合。因此我们可以做一个通用的规则模块,供不同的功能组件调用,既可减少重复逻辑代码,方便维护,亦可一次开发,多模块共用,方便拓展。通用规则模块如(图2)所示:图2
下面我们来逐步实现通用规则模块的开发,本文虽以PHP代码为例说明,但设计思想是相通的。02

if-else工程师?
有人说在编程领域,没有什么是if-else不能解决的,如果有,那就多来几个if-else。在项目初期,往往以快速实现功能为目标,不要跟我说什么架构什么设计模式,拿起键盘就是敲。如(图3)所示,有3项规则需要实现,代码如下:class Client {
/** * 检查规则 * @param [string] $rule_type 规则类型 * @return [bool] */ public function rule_check($rule_type) {
if ($rule_type == 'FREE') {
//处理免费规则逻辑 } elseif ($rule_type == 'PAY') {
//处理充值规则逻辑 } elseif ($rule_type == 'LOGIN') {
//处理登录规则逻辑 } else {
//默认处理 } return true; }}
如果只有简单的两三项逻辑,确实可以用以上的if-else轻松解决。而当业务场景逐渐丰富,规则也慢慢增多,如(图4)所示:从原有的3项规则变成5项。