`
youthon
  • 浏览: 17659 次
  • 性别: 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)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

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

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

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

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

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

    允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

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

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

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

    NULL 博文链接:https://zhangyan19870108.iteye.com/blog/1992409

    StatePattern.unitypackage

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

    设计模式State模式源码

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

    C#版 24种设计模式

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

    用Java实现23种设计模式

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

    python 状态模式(示例)

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

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

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

    C#设计模式(23种设计模式)

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3.... 4.... 5.... 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) ... 状态模式(State Pattern) @Author kwming

    设计模式PPT

    创建型模式用来处理对象的创建过程,主要包含以下5种设计模式: ... 状态模式(State Pattern)  策略模式(Strategy Pattern)  模板方法模式(Template Method Pattern)  访问者模式(Visitor Pattern)

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册....状态模式(State) 策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor)

    状态模式代码

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

    33种JAVA设计模式DEMO

    状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由...

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype...23. 状态模式(State Pattern)

    23种设计模式 (创建型,结构型,行为型)

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3.... 4.... 5.... 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator ... 状态模式(State Pattern)

Global site tag (gtag.js) - Google Analytics