设计模式(二十)—— 状态模式

状态模式

定义

对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,当一个对象内在改变时允许其改变行为,这个对象看起来像改变了其类。

  • State:抽象状态角色,接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。
  • ConcreteState:具体状态角色,职责是本状态的行为管理以及趋向状态处理,也就是本状态需要处理的事情以及本状态如何过度到其他状态。
  • Context:环境角色,定义客户端需要的接口,并且负责具体状态的切换。

具体实现:

1
2
3
4
5
6
7
8
9
10
11
public abstract class State {

protected Context context;

public void setContext(Context context) {
this.context = context;
}

abstract void handle1();
abstract void handle2();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class ConcreteState1 extends State{
@Override
void handle1() {
System.out.println("ConcreteState1处理逻辑");
}

@Override
void handle2() {
super.context.setState(Context.STATE2);
super.context.handle2();
}
}
public class ConcreteState2 extends State {
@Override
void handle1() {
super.context.setState(Context.STATE1);
super.context.handle1();
}

@Override
void handle2() {
System.out.println("ConcreteState2处理逻辑");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Context {
public final static State STATE1 = new ConcreteState1();
public final static State STATE2 = new ConcreteState2();

private State state;

public State getState() {
return state;
}

public void setState(State state) {
this.state = state;
this.state.setContext(this);
}

public void handle1(){
this.state.handle1();
}

public void handle2(){
this.state.handle2();
}
}

public static void main(String[] args) {
Context context = new Context();
context.setState(new ConcreteState1());
context.handle1();
context.handle2();
System.out.println("------------");
context.setState(new ConcreteState2());
context.handle2();
context.handle1();
}
//输出
ConcreteState1处理逻辑
ConcreteState2处理逻辑
------------
ConcreteState2处理逻辑
ConcreteState1处理逻辑

优点

  • 结构清晰,减少if…else和switch…case使用,避免程序复杂性,提高系统的可维护性。
  • 遵循设计原则,体现了单一职责和开闭原则,每个状态都是一个子类,要增加状态就修改子类。
  • 封装性好,状态变换放到类的内部实现,外不调用不用知道类的内部是如何实现的。

缺点

  • 子类会太多,出现类膨胀。

使用场景

  • 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。
  • 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。

注意事项

状态模式适用于当某个对象在他的状态发生改变时,他的行为也随着发生比较大的变化,也就是说在行为受状态约束的情况下可以使用状态模式,而且使用时对象的状态最好不要超过五个。

代码:GitHub


欢迎关注公众号:
公众号微信

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
显示 Gitment 评论