您的位置:首页 > 其它

设计模式详细系列教程 (三)以网上购物通用的订单流程 详解状态模式

2012-08-08 15:05 741 查看
这是用用EA画的状态图,从图上可以看出,它详细的表明了购物订单形成以及发送流程,在订单形成的过程中,会经过各种状态来处理,什么时候进入哪一个状态需要复杂的逻辑来判断,为了使逻辑简单化,我们可以应用状态模式,把复杂的逻辑判断分布到各个子类中去,首先,看一下状态图:



这个图描述了订单各种状态如:增加订单、注册、批准、发送、打印发票、取消等一系列过程。

我们应用设计模式将它转换为状态模式图:如下



我们抽象除了一个OrderState类,封装与所有状态相关的行为,不同的子类有不同的行为实现。

可以这样理解,状态模式=聚合+继承。

各种状态正好可以聚合在一起,但对于每个状态又不是非有不可,一定包括在内,图中的SalseOrder类控制着个状态类的实例对象,因为它具有的功能即设置、读取各个实例对象。而判断具体哪个状体进行实例化的逻辑判断已经分布到了各个实例内部,所以,状态模式使得代码灵活、并且易于扩展了。

也可以这样理解,状态模式就是一个特殊的类。它有很多属性,具体要用到哪一个属性它自己并不决定,而是由属性自己决定,在我们的生活中这样的事情举不胜数,例如:作为一个好的领导,必须懂得把权力给别人,不要每件事都亲自决定、亲自判断,如果那样就得累死自己,懂得放权才是一个好的领导。这不就是把权力下放的使用,它自己只负责显示结果,减轻自己的负担,学会领导别人。

学习是来源于生活,又高于生活的一种行为,学习切不可脱离生活,以生活为基础,去理解、认识我们学习的东西,它会加深你的认识、理解,你一定会找到某些共性,并发现一些有价值的东西,反过来,指导生活,使自己一点一点提高。

下面是经典的状态模式:



看完这张图,你是否想到了类似的模式,那就是策略模式,其实,状态模式与策略模式它们的图是完全一样的,即原理一样。但它们的差别在于侧重点不一样,解决的问题不一样,策略模式在于解决算法,如商场促销手段有很多种打一折、打两折 、满100送100等,一些具有弹性的问题。而状态模式在于分解复杂逻辑,使复杂的逻辑分布到各个子类中,是程序代码简化。

记住每个设计模式的图并不重要,关键在于理解和应用,设计模式是一个长期的学习!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: