Zer0e's Blog

设计模式之状态模式

字数统计: 538阅读时长: 2 min
2020/09/06 Share

前言

本篇来谈谈状态模式。

正文

概念

状态模式属于行为型模式,在这个模式中类的行为是根据类的状态发生改变的。在类中维护一个状态变量,当其改变时类的行为就发生改变,看上去就跟改变了类本身一样。
那状态模式涉及的角色有:

  • 环境(context):上下文,通常定义客户端可用的接口,内部维护一个状态实例,根据这个状态做出不一样的行为。
  • 抽象状态(state):一个接口,用于封装环境(context)对象的状态
  • 具体状态(concreteState):实现抽象状态。

那这个模式常见的场景就是可以替代条件语句,if,switch等等,避免语句过长。

实现

这个模式还是比较简单的,我们就写写上面提到的几个角色
我们先定义state接口:

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

然后是具体的state

1
2
3
4
5
6
7
8
9
10
11
12
public class ConcreteStateA implements State{
@Override
public void handle() {
System.out.println("对应StateA的操作");
}
}
public class ConcreteStateB implements State{
@Override
public void handle() {
System.out.println("对应StateB的操作");
}
}

然后定义环境,用于客户端的调用

1
2
3
4
5
6
7
8
9
10
11
public class Context {
private State state;

public void setState(State state) {
this.state = state;
}
// 用户需要的接口方法
public void request(){
state.handle();
}
}

最后编写客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Client {
public static void main(String[] args) {
Context context = new Context();
State stateA = new ConcreteStateA();
State stateB = new ConcreteStateB();

context.setState(stateA);
context.request();

context.setState(stateB);
context.request();
}
}

可以发现,通过设置context的状态可以实现不同的操作。看上去就像context对象本身发生改变一样。

优缺点

最后来讲讲优缺点。
状态模式的优点有,把实现的细节隐藏,客户端只需要设置状态,无需关心内部的实现,并且可以去除大量的逻辑判断语句,可读性更高。
而缺点在于当状态增多时,类的数量会增加,并且当增加新的状态类时,context可能会做出修改,不符合开闭原则。

CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 概念
    2. 2.2. 实现
    3. 2.3. 优缺点