浏览 2661 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (4)
|
|
---|---|
作者 | 正文 |
发表时间:2009-10-23
最后修改:2010-10-20
状态模式允许一个对象在其内部状态改变的时候改变其行为,这个对象看上去就像是改变了它的类一样。 模式所涉及的角色: 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、动态分派:发生在运行时期,动态分派动态地置换掉某个方法。面向对象的语言利用动态分派来实现方法置换产生的多态性。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |