`
youthon
  • 浏览: 18476 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

状态模式(State Pattern)

 
阅读更多

原文地址:http://www.iteye.com/topic/503075

状态(State Pattern)模式:又称为状态对象模式,状态模式是对象的行为模式

状态模式允许一个对象在其内部状态改变的时候改变其行为,这个对象看上去就像是改变了它的类一样。

模式所涉及的角色:
1、抽象状态角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为。
2、具体状态角色:每一个具体状态类都实现了环境的一个状态所对应的行为。

3、环境角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境的现有状态。

                //环境角色
		public class Context{
			private State state;
			
			public void sampleOperation(){
				state.sampleOperation();
			}
			
			public void setState(State state){
				this.state = state;
			}
		}
		
		//抽象状态角色
		public interface State{
			void sampleOperation();
		}
		
		//具体状态类
		public class ConcreteState implements State{
			public void sampleOperation(){}
		}
一、状态模式的效果:
1、状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统类的状态变化时,系统便改变所选的子类。所有与一个特定的状态有关的行为都被包装到一个特定的对象里面,使得行为的定义局域化,因为同样的原因,如果有 新的状态以及对应的行为需要定义时,可以很方便地通过设立新的子类的方式加到系统里,不需要改动其他的类
2、由于每一个状态都被包装到子类里面,就可以不必采用过程性的处理方式,使用长篇累读的条件转移语句。
3、使用状态模式使 系统状态的变化变得很明显。由于不用一些属性(内部变量)来指明系统所处的状态,因此就不用担心修改这些属性不当而造成的错误。
4、可以在系统的不同部分使用相同的一些状态类的对象。这种共享对象的办法是与亨元模式相符合的。事实上,此时这些状态对象基本上是只有行为而没有内部状态的亨元模式。
5、状态模式的缺点是会造成大量的小的状态类:优点是使程序免于大量的条件转移语句,使程序实际上更易于维护。
6、系统所选的状态子类均是从一个抽象状态类或接口继承而来,java语言的特性,使得在java语言中使用状态模式较为安全。多态性原则是状态模式的核心。

二、在什么情况下使用状态模式
1、一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变。
2、对象在某个方法里依赖于一重或多重的条件转移语句,其中有大量的代码。状态模式把条件转移语句的每一个分支都包装到一个单独的类里。这使得这些条件转移分支能够以类的方式独立存在和演化,维护这些独立的类也就不再影响到系统的其他部分。

三、状态模式实现时应该注意的地方
(1)谁来定义状态的变化。状态模式并没有规定哪一个角色决定状态发生转换的条件。如果转换条件是固定的,那么就可以把曲子存储在编钟里,由编钟自己演奏,决定所发的音的转换。

然而,如果让State子类自行决定一它的下一个继任者是谁,以及在什么时候进行转换,就更灵活了。仍然以编钟为例,可以把程序存储在每一个钟里,由每一个钟自行决定下面该发生的钟是哪一个,以及该在什么时候发声,这样就更有灵活性。或者,由外界事件来决定状态的转换。也就是说,把编钟的演奏交给系统外部的演奏师。

(2)状态对象的创立和湮灭。其中值得权衡的做法有两种:
1、动态地创立所需要的状态对象,不要创立不需要的状态对象。当不再需要某一状态对象时,便马上把此状态对象的实例湮灭掉。这相当于在需要某一只钟时,才把这只钟挂在编钟上;当这只钟使用完后,就立即把它卸下来;当再次使用时,再把它挂回去,这对编钟来说不是一个好主意。
2、事先创立所有的对象,然后不再湮灭它们。这相当于把事先说的钟都挂在编钟上,然后在演奏过程中并不把它们卸下来。这显然适用于状态变化比较快和濒繁、加载这些状态对象的成本较高的情况,比如编钟系统。

对于java系统,湮灭一个对象不是由程序完全控制的。当一个对象不再被引用时,java语言的垃圾处理器会自动把它湮灭掉,但是具体在什么时候湮灭,则不是可以控制的,甚至不是可以预料的。
3、环境类把它自己作为参量传给状态对象。这样。一旦需要,状态对象就可以调用环境对象。

四、分派:
1、静态分派:发生在编译时期,分派根据静态类型信息发生,静态分派对于读者来说应当并不陌生,方法重载就是静态分派。

2、动态分派:发生在运行时期,动态分派动态地置换掉某个方法。面向对象的语言利用动态分派来实现方法置换产生的多态性。


分享到:
评论

相关推荐

    状态模式 State Pattern

    ### 状态模式(State Pattern) #### 概念与定义 状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。该模式通过引入一个代表各种状态的类以及一个行为随着这些...

    设计模式之状态模式(State Pattern)

    状态模式是一种行为设计模式,它使你能在运行时改变对象的行为。在状态模式中,一个对象的状态变化会导致其行为的变化,这种变化不是通过改变对象的类来实现的,而是通过改变对象的状态。这个模式的核心是封装可能...

    JackChan1999#Java-Degisn-Patterns#状态模式-State Pattern1

    状态模式-State Pattern状态模式-State Pattern【学习难度:,使用频率:】状态模式-State Pattern处理对象的多种状态及其相互

    状态模式(State Pattern)是一种行为设计模式

    状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式将一个对象的行为分解为各个独立的状态,并且每个状态都封装在自己的类中,使得对象在...

    Head First 设计模式 (十) 状态模式(State pattern) C++实现

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且根据不同的状态,对象的行为也相应地变化。在C++中实现状态模式,我们...

    《设计模式》实战---状态模式(State Pattern)

    在《设计模式》实战---状态模式(State Pattern)这篇文章中,作者可能详细探讨了以下关键点: 1. **模式定义**:状态模式允许对象在内部状态改变时改变其行为,对象看起来好像修改了它的类。这通过将每个状态封装...

    基于state pattern实现的xml解释器

    在软件设计领域,状态模式(State Pattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在这个案例中,“基于state pattern实现的xml解释器”指的是一个XML解析器,该...

    nevstop#LabVIEW-Design-Pattern#状态模式(State Pattern)1

    状态模式定义Allow an object to alter its behavior when its internal state changes. The

    StatePattern.unitypackage

    StatePattern.unitypackage是一个unity演示的状态模式。有需要的同学可以自行下载。

    设计模式State模式源码

    State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果...

    JAVA设计模式之行为模式 责任链模式和状态模式

    本篇将探讨两种重要的行为设计模式:责任链模式(Chain of Responsibility Pattern)和状态模式(State Pattern)。 **责任链模式**是一种使多个对象都有机会处理请求的模式,避免请求发送者与接收者之间的耦合。在...

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) ...装饰模式(Decorator Pattern) 状态模式(State Pattern) 组合模式(Composite Pattern)

    状态模式Java实现示例

    状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。这个对象看起来好像修改了它的类。状态模式主要解决的是当一个对象的行为依赖于它的状态时,如何将这些状态从对象中...

    State Machine Java Pattern

    与传统的状态模式相比,采用状态机模式设计的类更加具有重用性。 #### 关键词 设计、模式、自动机、有限状态机、行为、状态、转换、状态图 #### 引言 自[Kle56]引入正则表达式并证明了有限自动机与正则表达式的...

    设计模式的状态模式的例子

    在"StatePattern"这个压缩包中,我们可能找到以下文件: - `State.java`: 定义了状态接口。 - `NormalState.java`, `BusyState.java`: 具体的状态类,实现了`State`接口并提供了对应状态的行为。 - `Context.java`:...

    python 状态模式(示例)

    设计模式——状态模式状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6.... 状态模式(State Pattern)

    用Java实现23种设计模式

    状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表...

    状态模式ppt

    状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,从而使对象看起来好像修改了其类。这种模式使得状态转换逻辑与状态对象本身相结合,而非采用复杂的条件语句。 #### 二、...

Global site tag (gtag.js) - Google Analytics