0%

设计模式-状态模式

状态模式(State pattern),属于行为型模式,对象内部状态发生改变的时候,其行为也发生改变。

结构


涉及到了三个角色,Context(上下文)、State(状态)、ConcreteState(具体状态)

上下文

Context,包含对具体状态的引用,并将特定任务委派给它,示例如下

1
2
3
4
5
6
7
8
9
public class TVContext {
private State state;
public void setState(State state){
this.state = state;
}
public void request(){
state.handle(this);
}
}

状态

State,接口,规定抽象行为,示例如下

1
2
3
public interface State {
void handle(TVContext context);
}

具体状态

ConcreteState,状态特定方法实现,定义以下两个实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
public class TVStartState implements State{
@Override
public void handle(TVContext context) {
System.out.println("TV is turned ON");
}
}

public class TVStopState implements State{
@Override
public void handle(TVContext context) {
System.out.println("TV is turned OFF");
}
}

客户端

对如上代码测试,示例如下

1
2
3
4
5
6
7
8
public class Client {

public static void main(String[] args) {
TVContext context = new TVContext();
context.setState(new TVStartState());
context.request();
}
}

output:

1
TV is turned ON

与策略模式比较

策略模式和状态模式都可以消除大量的if-else语句,结构也相似,但两者还是有很大差别。

  • 策略模式解决算法自由切换的问题,状态模式解决因内部状态改变而引起行为改变的问题
  • 策略模式的算法需要平行,状态模式的对象需要能用状态和行为描述

完整代码

完整代码已上传,项目地址https://github.com/yuan0824/DesignPattern

参考资料