我正在使用php
来创建USSD页面。我以前做过这件事,这是一个时间紧迫的黑客工作;基本上是一个巨大的文件,带有一个switch语句,用于手机用户可以进入的所有状态(然后保存在DB中,并在下一个USSD请求时检索) - 一种状态机。
这一次,我有更多的时间,并希望使用更多专业。我可以在这种情况下使用任何设计模式或最佳实践吗?
答案 0 :(得分:3)
答案 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())
]);
这是一个特定于我的用例的有限解决方案,我相信它可以扩展到迎合其他情况。我想听听其他人如何解决这个问题