`
youthon
  • 浏览: 18718 次
  • 性别: 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)。 **责任链模式**是一种使多个对象都有机会处理请求的模式,避免请求发送者与接收者之间的耦合。在...

    状态模式Java实现示例

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

    State Machine Java Pattern

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

    C#版 24种设计模式

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

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

    在"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) 业务代表...

    状态机模式代码生成器 Finite State Machine Compiler

    Robert C. Martin做了两个自动产生FSM代码的工具,for ...这个工具的输入是纯文本的状态机描述,自动产生符合State Pattern的代码,这样developer的工作只需要维护状态机的文本描述,没必要冒引入bug的风险去维护code。

Global site tag (gtag.js) - Google Analytics