状态变化模式
2016-10-04 本文已影响35人
timber_wu
在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。
典型模式
- State
- Menmento
State状态模式
动机
- 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于之都状态,其支持的行为和读写状态支持的行为就可能完全不同。
- 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合?
模式定义
允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
结构
类图模式中的角色:
- 1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。
- 2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
- 3 具体状态(Concrete State):实现抽象状态定义的接口。
状态模式的代码演示
import sun.security.krb5.internal.NetClient;
public abstract class NetworkState{
public NetworkState next;//指针,指向下一状态
public abstract void Operation1();
public abstract void Operation2();
public abstract void Operation3();
/ /抽象出三个方法
}
public class OpenState extends NetworkState{
@Override
public void Operation1(){
//**********
next = new CloseState();
}
@Override
public void Operation2(){
//..........
next = new ConnectState();
}
@Override
public void Operation3(){
//$$$$$$$$$$
next = new OpenState();
}
}
public class CloseState extends NetworkState{
@Override
public void Operation1(){
//**********
next = new ConnectState();
}
@Override
public void Operation2(){
//..........
next = new OpenState();
}
@Override
public void Operation3(){
//$$$$$$$$$$
next = new CloseState();
}
}
public class ConnectState extends NetworkState{ }
public class WaitingState extends NetworkState{ }
//...
class NetworkProcessor{
NetworkState state;
public NetworkProcessor(NetworkState state){
this.state = state;
}
public void Operation1(){
//...
state.Operation1();
state = state.next;
//...
}
public void Operation2(){
//...
state.Operation2();
state = state.next;
//...
}
public void Operation3(){
//...
state.Operation3();
state = state.next;
//...
}
}
模式总结
优点
- 状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
- 所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。
- 状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。
缺点
- 导致较多的ConcreteState子类