设计模式系列十二 状态模式介绍
2015-01-23 00:00
253 查看
摘要: 状态模式介绍
一、来个例子
一个糖果机,他有多种不同的状态:图01.jpg
新的设计,将状态对象封装在各自的类中,然后在动作发生时委托给当前状态。
我么要做的事情:
1、首先,我们定义一个State接口,在这个接口内,糖果机的每个动作都有一个对应的方法。
2、然后为机器中的每个状态实现状态类。这些类将负责在对应的状态下进行机器的行为。图02.jpg
二、定义状态模式
状态模式 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
这个描述中的第一部分附有相当多的涵义,是吧?因为这个模式将状态封装成独立的类,并将动作委托到代表当前状态的对象,我们知道行为会随着内部状态而改变。
而这个定义中的第二部分呢?一个对象“看起来好像修改了它的类”是什么意思呢?从客户的视角来看:如果说你使用的对象能够完全改变它的行为,那么你会觉得,这个对象实际上是从别的类实例化而来的。然而,实际上,你知道我们是在使用组合通过简单引用不同的状态对象来造成类改变的假象。
看看状态模式的类图:图03.jpg
三、与策略模式比较
两者的类图是一样的,但是这两个模式的差别在于他们的”意图“。
1、以状态模式而言,我们将一群行为封装在状态对象中,context的行为随时可委托到那些状态对象中一个。随着时间的流逝,当前状态在状态对象集合中游走改变,以反映出context内部的状态,因此,context的行为也会跟着改变。但是context的客户对于状态对象了解不多,甚至根本是浑然不觉。
2、而以策略模式而言,客户通常主动指定Context所要组合的策略对象是哪一个。现在,固然策略模式让我们具有弹性,能够在运行时改变策略,但对于某个Context对象来说,通常都只有一个最适当的策略对象。
一般来说,我们把策略模式想成是除了继承之外的一种弹性替代方案。如果你使用继承定义了一个类的行为,你将被这个行为困住,甚至要修改它都很难。有了策略模式,你可以通过组合不同的对象来改变行为。
我们把状态模式想成是不用在Context中放置许多条件判断的替代方案。通过将行为包装进状态对象中,你可以通过在Context内简单地改变状态对象来改变Context的行为。
四、回顾要点
1、状态模式允许一个对象基于内部状态而拥有不同的行为。
2、Context会将行为委托给当前状态对象。
3、通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了。
4、状态模式和策略模式有相同的类图,但是他们的意图不同。
5、策略模式通常会用行为或算法来配置Context类。
6、状态模式允许Context随着状态的改变而改变行为。
7、状态转换可以有State类或Context类控制。
8、使用状态模式通常会导致设计中类的数目大量增加。
9、状态类可以被多个Context实例共享。
一、来个例子
一个糖果机,他有多种不同的状态:图01.jpg
新的设计,将状态对象封装在各自的类中,然后在动作发生时委托给当前状态。
我么要做的事情:
1、首先,我们定义一个State接口,在这个接口内,糖果机的每个动作都有一个对应的方法。
2、然后为机器中的每个状态实现状态类。这些类将负责在对应的状态下进行机器的行为。图02.jpg
二、定义状态模式
状态模式 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
这个描述中的第一部分附有相当多的涵义,是吧?因为这个模式将状态封装成独立的类,并将动作委托到代表当前状态的对象,我们知道行为会随着内部状态而改变。
而这个定义中的第二部分呢?一个对象“看起来好像修改了它的类”是什么意思呢?从客户的视角来看:如果说你使用的对象能够完全改变它的行为,那么你会觉得,这个对象实际上是从别的类实例化而来的。然而,实际上,你知道我们是在使用组合通过简单引用不同的状态对象来造成类改变的假象。
看看状态模式的类图:图03.jpg
三、与策略模式比较
两者的类图是一样的,但是这两个模式的差别在于他们的”意图“。
1、以状态模式而言,我们将一群行为封装在状态对象中,context的行为随时可委托到那些状态对象中一个。随着时间的流逝,当前状态在状态对象集合中游走改变,以反映出context内部的状态,因此,context的行为也会跟着改变。但是context的客户对于状态对象了解不多,甚至根本是浑然不觉。
2、而以策略模式而言,客户通常主动指定Context所要组合的策略对象是哪一个。现在,固然策略模式让我们具有弹性,能够在运行时改变策略,但对于某个Context对象来说,通常都只有一个最适当的策略对象。
一般来说,我们把策略模式想成是除了继承之外的一种弹性替代方案。如果你使用继承定义了一个类的行为,你将被这个行为困住,甚至要修改它都很难。有了策略模式,你可以通过组合不同的对象来改变行为。
我们把状态模式想成是不用在Context中放置许多条件判断的替代方案。通过将行为包装进状态对象中,你可以通过在Context内简单地改变状态对象来改变Context的行为。
四、回顾要点
1、状态模式允许一个对象基于内部状态而拥有不同的行为。
2、Context会将行为委托给当前状态对象。
3、通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了。
4、状态模式和策略模式有相同的类图,但是他们的意图不同。
5、策略模式通常会用行为或算法来配置Context类。
6、状态模式允许Context随着状态的改变而改变行为。
7、状态转换可以有State类或Context类控制。
8、使用状态模式通常会导致设计中类的数目大量增加。
9、状态类可以被多个Context实例共享。
相关文章推荐
- 设计模式系列之十二状态模式
- 设计模式之(十二、状态模式State)
- 设计模式学习系列十二:观察者模式(Observer)
- 【设计模式系列】设计模式读书笔记——主流设计模式的简单介绍
- 设计模式系列一 设计模式介绍
- 深入理解JavaScript系列(43):设计模式之状态模式
- 本文详细介绍Python 设计模式系列之二: 创建型 Simple Factory 模式(转载)
- 深入理解JavaScript系列(43):设计模式之状态模式
- C#设计模式系列:状态模式(State)
- 研磨设计模式 之 状态模式(State)1——跟着cc学设计系列
- Java设计模式菜鸟系列(十二)组合模式建模与实现
- 极速理解设计模式系列:22.状态模式(State Pattern)
- 设计模式详细系列教程 (三)以网上购物通用的订单流程 详解状态模式
- 设计模式详细系列教程 (三)以网上购物通用的订单流程 详解状态模式
- 深入理解JavaScript系列(43):设计模式之状态模式
- 设计模式系列6-----C++实现状态模式(State Pattern)
- 深入理解JavaScript系列(43):设计模式之状态模式
- 设计模式系列-状态模式
- 设计模式实现(十二)--- 状态模式(State)
- 状态模式-设计模式系列