状态(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、动态分派:发生在运行时期,动态分派动态地置换掉某个方法。面向对象的语言利用动态分派来实现方法置换产生的多态性。
分享到:
相关推荐
创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6.... 状态模式(State Pattern)
21. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变其行为,使对象看起来似乎修改了其类。 通过学习和掌握这些设计模式,可以提高程序员的设计和编码能力,提高软件系统的灵活性、可维护性和可...
17. **State(状态)模式**:允许一个对象在其内部状态改变时改变它的行为。 18. **Visitor(访问者)模式**:表示一个作用于某对象结构中的各元素的操作。 #### 三、编码模式(Coding Pattern) 编码模式是指在...
#### 第12章 命令模式(Command Pattern) 命令模式是一种行为型设计模式,它将请求封装为一个对象,从而使用户可以用不同的请求来参数化客户端。 ##### 描述 命令模式可以将发送者与接收者解耦,发送者并不知道...
**状态模式(State Pattern)** - **定义**:允许一个对象在其内部状态改变时改变它的行为。 - **应用场景**:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时。 - **实例**:在...
14. 状态模式(State Pattern):允许对象在其内部状态改变时改变其行为。在ASP.NET中,可以用于用户会话状态管理,根据状态执行不同的操作。 15. 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装...
行为模式 设计模式之 Command(命令) 什么是将行为封装,Command 是最好的说明. 设计模式之 Observer(观察者) 介绍如何使用 Java API 提供的现成 Observer 设计模式之 Iterator(迭代器) 这个模式已经被整合入...
状态模式(State Pattern) - **定义**:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 - **意图**:对象在其内部状态改变时改变行为。 - **适用性**: - 一个对象的行为取决于它的...
#### 第12章:命令模式【COMMAND PATTERN】 **定义与作用:** 命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 **实现原理:** - ...
- 状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为。 - 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。 后三章讨论了更为高级的话题。第12章探讨了如何将...
第十二章讨论了多重分发的概念,并介绍了访客模式作为多重分发的一种形式。多重分发是指根据多个参数来选择方法实现的方式。 #### 十四、模式重构 最后一章重点介绍了模式重构的过程和技术,通过具体的例子展示了...
16. **状态模式**(State):允许对象在其内部状态改变时改变其行为,对象看起来似乎修改了它的类。 17. **策略模式**(Strategy):定义一系列的算法,把它们一个个封装起来,并使它们可以互相替换。策略模式让...
17. State Machine的实现:状态机有不同的实现方式,如有限状态自动机(Finite State Machine, FSM),每个状态都有一个对应的行为。不同的实现方法有不同的特点和适用场景。 18. 同步操作:多线程程序中,互斥锁...
抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承...