设计模式-状态模式

状态模式

  很多情况下,一个对象的行为取决于一个或多个状态变化的属性,这样的属性叫状态。这样的对象叫做有状态的对象,这样的状态是从事先定义好的一系列值中获取的。当一个这样的对象与外部产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生改变。

示例

环境类

1
2
3
4
5
6
7
8
9
10
11
12

public class Context {
private State state;

public State getState() {
return state;
}

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

抽象状态接口

1
2
3
4
5
6

public interface State {

void handle(Context context);

}

具体状态类

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

public class StartState implements State {
@Override
public void handle(Context context) {
System.out.println("player is in start state");
context.setState(this);
}

@Override
public String toString() {
return "start state";
}
}

public class StopState implements State {
@Override
public void handle(Context context) {
System.out.println("player is in stop state");
context.setState(this);
}

@Override
public String toString() {
return "stop state";
}
}

测试类

1
2
3
4
5
6
7
8
9
10
11
public void test() {
Context context = new Context();

StartState startState = new StartState();
startState.handle(context);

StopState stopState = new StopState();
stopState.handle(context);


}

结果

1
2
3

player is in start state
player is in stop state

总结

  状态模式和命令模式一样,可以用于消除if-else等条件选择语句。

  • 优点

  封装了状态转换规则,状态转换代码可以封装在环境类或者具体状态类中,可以对状态转换代码进行集中管理,而不是分散在一个个业务代码中。

  将所有与状态有关的行为放到一个类中,只需要注入不同的状态对象即可是环境对象拥有不同的行为。

  允许状态转换逻辑与状态对象合成一体,而不是提供一个巨大的条件语句块,状态模式可以让我们避免使用庞大的条件语句来讲业务方法和状态转换代码交织在一起。

  • 缺点

  增加系统内类的个数。
  实现复杂,增加系统设计难度
  对“开闭原则”支持不好,增加新的状态类需要修改负责状态转换的代码。

-------------本文结束感谢您的阅读-------------

本文标题:设计模式-状态模式

文章作者:小建儿

发布时间:2018年08月18日 - 17:08

最后更新:2018年08月18日 - 17:08

原始链接:http://yajian.github.io/设计模式-状态模式/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。