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

这个图描述了订单各种状态如:增加订单、注册、批准、发送、打印发票、取消等一系列过程。
我们应用设计模式将它转换为状态模式图:如下

我们抽象除了一个OrderState类,封装与所有状态相关的行为,不同的子类有不同的行为实现。
可以这样理解,状态模式=聚合+继承。
各种状态正好可以聚合在一起,但对于每个状态又不是非有不可,一定包括在内,图中的SalseOrder类控制着个状态类的实例对象,因为它具有的功能即设置、读取各个实例对象。而判断具体哪个状体进行实例化的逻辑判断已经分布到了各个实例内部,所以,状态模式使得代码灵活、并且易于扩展了。
也可以这样理解,状态模式就是一个特殊的类。它有很多属性,具体要用到哪一个属性它自己并不决定,而是由属性自己决定,在我们的生活中这样的事情举不胜数,例如:作为一个好的领导,必须懂得把权力给别人,不要每件事都亲自决定、亲自判断,如果那样就得累死自己,懂得放权才是一个好的领导。这不就是把权力下放的使用,它自己只负责显示结果,减轻自己的负担,学会领导别人。
学习是来源于生活,又高于生活的一种行为,学习切不可脱离生活,以生活为基础,去理解、认识我们学习的东西,它会加深你的认识、理解,你一定会找到某些共性,并发现一些有价值的东西,反过来,指导生活,使自己一点一点提高。
下面是经典的状态模式:

看完这张图,你是否想到了类似的模式,那就是策略模式,其实,状态模式与策略模式它们的图是完全一样的,即原理一样。但它们的差别在于侧重点不一样,解决的问题不一样,策略模式在于解决算法,如商场促销手段有很多种打一折、打两折 、满100送100等,一些具有弹性的问题。而状态模式在于分解复杂逻辑,使复杂的逻辑分布到各个子类中,是程序代码简化。
记住每个设计模式的图并不重要,关键在于理解和应用,设计模式是一个长期的学习!!
- 11楼a1314517love昨天 21:29
- 图文并茂,强,长收
- Re: lilongsheng1125昨天 21:30
- 回复a1314517loven板凳也不错…………
- Re: a137151062昨天 22:55
- 你就比我快那么一点点,沙发就没了
- Re: lilongsheng1125昨天 07:45
- 回复a137151062n板凳也不错……
- 10楼wwwwenhuan昨天 19:38
- 订单处理是用来描述状态图的经典案例
- Re: lilongsheng1125昨天 21:27
- 回复wwwwenhuann[e01]
- Re: lilongsheng1125昨天 21:29
- 回复wwwwenhuann恩,这个例子易于理解,而且比较合适……
- 9楼a137151062昨天 19:01
- 楼主写的不错,学习了[e01]
- Re: lilongsheng1125昨天 19:01
- 回复a137151062n学习设计模式…………
- 8楼aboy123昨天 17:48
- 易于理解啊
- Re: lilongsheng1125昨天 17:51
- 回复aboy123n画画图,就好理解了!![e04]
- 7楼gwblue昨天 16:02
- 值得学习!
- Re: lilongsheng1125昨天 16:55
- 回复gwbluen深入学习……
- 6楼hejingyuan6昨天 15:51
- 加油
- Re: lilongsheng1125昨天 16:02
- 回复hejingyuan6n恩,恩,加油!!
- 5楼lfmilaoshi昨天 15:18
- 设计模式的学习,要思想上移。。。。米老师
- Re: lilongsheng1125昨天 15:45
- 回复lfmilaoshin奥奥,知道了 米老师,主要是解决某些问题,灵活运用。
- 4楼Wentasy昨天 15:16
- “设计模式是一个长期的学习”,赞一个。
- Re: lilongsheng1125昨天 15:17
- 回复Wentasyn很长,很长
- Re: lilongsheng1125昨天 15:17
- 回复Wentasyn很长很长……
- 3楼dengziyu928昨天 15:13
- 呵呵 网上购物流程不错啊
- Re: lilongsheng1125昨天 15:15
- 回复dengziyu928n贴近生活!![e04]
- 2楼yjjm1990昨天 15:11
- 楼主人才!
- Re: lilongsheng1125昨天 15:11
- 回复yjjm1990n[e04]
- Re: lilongsheng1125昨天 15:11
- 回复yjjm1990n[e03]
- Re: lilongsheng1125昨天 15:13
- 回复yjjm1990nSo do you!!
- 1楼happylee6688昨天 15:11
- 总结的不错。
- Re: lilongsheng1125昨天 15:11
- 回复happylee6688n恩……