ussd的设计模式建议

时间:2011-09-20 21:55:57

标签: php design-patterns ussd

我正在使用php来创建USSD页面。我以前做过这件事,这是一个时间紧迫的黑客工作;基本上是一个巨大的文件,带有一个switch语句,用于手机用户可以进入的所有状态(然后保存在DB中,并在下一个USSD请求时检索) - 一种状态机。

这一次,我有更多的时间,并希望使用更多专业。我可以在这种情况下使用任何设计模式或最佳实践吗?

2 个答案:

答案 0 :(得分:3)

好的,所以搜索USSD特定的东西是个错误。只需用USSD替换state machine就可以得到我looking for的答案。

答案 1 :(得分:0)

我也在与这个问题作斗争。我的方法是使用一个树,其中每个ussd状态是一个节点。让我用最好的方式来说明

interface Node {
    render(),
    process(input)
}

节点分为选择节点和输入节点。

选择

选择节点只向用户提供可供选择的选项,然后将用户引用到其子节点或显示错误消息

class Selection extends Node {
    Node[] children;
    string title;
    render() {
         // create a ussd menu here appending title to 
         // menu items based on this.children
    }
    process(input) {
        // get input and select from children node
        // call its render method
    }
}

输入

输入节点收集用户的实际输入(如姓名,凭证编号等),并进行处理,如查询数据库或调用远程API,然后向用户显示响应。

class Input extends Node {
    string title;
    string instruction;
    Handler handler;

    render() {
         // show title and/or instruction to user 
    }

    process(input) {
        // validate input and then pass to this.handler
    }
}

为了进一步解耦逻辑,我添加了一个处理程序接口,每个Input节点都需要一个处理程序。所有处理逻辑都驻留在Handler

interface Handler {
    handle()
}

解析器

现在,您可以创建一个Resolver类来处理ussd会话信息,以及所有http内容(如果您通过http接收ussd请求)。解析器还根据用户输入转换树以收集负责的节点,然后调用它的渲染或处理方法。你的树看起来像这样

new Selection('Main Menu (title)', [
    new Selection('My account', [...]),
    new Input('Recharge', 'Enter voucher number', new RechargeHandler())
]);

这是一个特定于我的用例的有限解决方案,我相信它可以扩展到迎合其他情况。我想听听其他人如何解决这个问题