个人博客

http://www.milovetingting.cn

状态模式

模式介绍

状态模式中的行为是由状态来决定的,不同状态下有不同的行为。

模式定义

当一个对象的内在状态改变时允许其改变行为。

使用场景

  1. 一个对象的行为取决于它的状态,并且它必须在运行时根据状态来改变行为。

  2. 代码中包含大量与对象状态有关的条件语句。

简单使用

定义状态接口

1
2
3
4
5
6
public interface TvState {
public void nextChannel();
public void prevChannel();
public void turnUp();
public void turnDown();
}

定义实现类

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
41
42
43
44
45
46
47
public class PowerOnState implements TvState {

@Override
public void nextChannel() {
System.out.println("下一个频道");
}

@Override
public void prevChannel() {
System.out.println("上一个频道");
}

@Override
public void turnUp() {
System.out.println("增加音量");
}

@Override
public void turnDown() {
System.out.println("减小音量");
}

}

public class PowerOffState implements TvState{

@Override
public void nextChannel() {

}

@Override
public void prevChannel() {

}

@Override
public void turnUp() {

}

@Override
public void turnDown() {

}

}

定义控制类接口

1
2
3
4
public interface PowerController {
public void powerOn();
public void powerOff();
}

定义控制类的实现类

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
public class TvController implements PowerController {

private TvState mTvState;

private void setTvState(TvState tvState) {
mTvState = tvState;
}

@Override
public void powerOn() {
setTvState(new PowerOnState());
System.out.println("开机啦");
}

@Override
public void powerOff() {
setTvState(new PowerOffState());
System.out.println("关机啦");
}

public void nextChannel() {
mTvState.nextChannel();
}

public void prevChannel() {
mTvState.prevChannel();
}

public void turnUp() {
mTvState.turnUp();
}

public void turnDown() {
mTvState.turnDown();
}

}

调用

1
2
3
4
5
6
7
8
public static void main(String[] args) {
TvController tvController = new TvController();
tvController.powerOn();
tvController.nextChannel();
tvController.turnUp();
tvController.powerOff();
tvController.turnDown();
}

输出结果

1
2
3
4
开机啦
下一个频道
增加音量
关机啦