Java实现状态模式的示例代码

一、简介

1、定义

状态模式 (State Pattern)是一种行为型设计模式,允许对象在内部状态改变时改变它的行为。通过定义状态接口和具体状态类,将对象的状态和行为分开,使得状态改变时可以改变行为。

2、状态模式的结构

状态模式涉及以下几个角色:
State(状态接口):定义了状态类的共同接口,所有具体的状态类都实现这个接口。
ConcreteState(具体状态类):每个具体的状态类实现了State接口,并定义了在该状态下的具体行为。
Context(上下文):上下文类维护一个当前状态的引用,它通常会委托给具体的状态类来执行相应的状态切换。

二、Java实现案例

1、电灯开关状态案例

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
 * @Description: 状态接口
 * @Date: 2025-02-07 17:09
 * @Author: gaoyufei
 **/
public interface State {
    void handle(Switch context);
}
 
/**
 * @Description: 关灯状态
 * @Date: 2025-02-07 17:12
 * @Author: gaoyufei
 **/
public class CloseState implements State{
    @Override
    public void handle(Switch switcher) {
        switcher.setState(new OpenState());
        System.out.println("开灯了");
    }
}
/**
 * @Description: 开灯状态
 * @Date: 2025-02-07 17:11
 * @Author: gaoyufei
 **/
public class OpenState implements State{
    @Override
    public void handle(Switch switcher) {
        switcher.setState(new CloseState());
        System.out.println("关灯了");
    }
}
/**
 * @Description: 开关,持有灯的状态
 * @Date: 2025-02-07 17:08
 * @Author: gaoyufei
 **/
public class Switch {
    private State state;
    public Switch(State state){
        this.state=state;
    }
    public void setState(State state){
        this.state=state;
    }
    public void press(){
        state.handle(this);
    }
}
 
/**
 * @Description: 操作人
 * @Date: 2025-02-07 17:14
 * @Author: gaoyufei
 **/
public class Operator {
    public static void main(String[] args) throws InterruptedException {
        Switch switcher=new Switch(new CloseState());//初始状态是关灯
        //模拟每隔1秒按压一下开关
        while (true){
            Thread.sleep(1000);
            switcher.press();
        }
    }
}

2、番茄工作法状态案例

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
 * @Description: 番茄状态接口
 * @Date: 2025-02-08 10:49
 * @Author: gaoyufei
 **/
public interface TomatoState {
    void deal(Worker worker);
}
 
/**
 * @Description: 番茄-工作状态类
 * @Date: 2025-02-08 10:51
 * @Author: gaoyufei
 **/
public class WorkTomatoState implements TomatoState {
    @Override
    public void deal(Worker worker) {
        System.out.println("休息结束了,开始工作吧");
        try {
            Thread.sleep(25*60*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("工作了25分钟");
        worker.setTomatoState(new RestTomatoState());
    }
}
 
/**
 * @Description: 番茄-休息状态类
 * @Date: 2025-02-08 10:53
 * @Author: gaoyufei
 **/
public class RestTomatoState implements TomatoState{
    @Override
    public void deal(Worker worker) {
        System.out.println("工作结束了,好好休息吧");
        try {
            Thread.sleep(5*60*1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("休息了5分钟");
        worker.setTomatoState(new WorkTomatoState());
    }
}
 
/**
 * @Description: 工作者
 * @Date: 2025-02-08 10:51
 * @Author: gaoyufei
 **/
public class Worker {
    private TomatoState tomatoState;
    public Worker(TomatoState tomatoState){
        this.tomatoState=tomatoState;
    }
    public void setTomatoState(TomatoState tomatoState){
        this.tomatoState=tomatoState;
    }
    public void startTomatoClock(){
        this.tomatoState.deal(this);
    }
}
 
/**
 * @Description: 客户端
 * @Date: 2025-02-08 11:02
 * @Author: gaoyufei
 **/
public class Client {
    public static void main(String[] args) {
        Worker worker=new Worker(new WorkTomatoState());
        while (true){
            worker.startTomatoClock();
        }
    }
}

3、电梯状态案例

这是一个简单的电梯系统。电梯的状态有关门、开门、上升、下降、停止。每个状态下电梯的行为不同。通过状态模式,根据电梯的不同状态执行不同的行为。

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
/**
 * @Description: 电梯状态接口
 * @Date: 2025-02-08 9:02
 * @Author: gaoyufei
 **/
public interface ElevatorState {
    void openDoor();
    void closeDoor();
    void moveUp();
    void moveDown();
    void stop();
}
/**
 * @Description: 关门状态
 * @Date: 2025-02-08 9:05
 * @Author: gaoyufei
 **/
public class CloseState implements ElevatorState {
    private Elevator elevator;
    public CloseState(Elevator elevator){
        this.elevator=elevator;
    }
    @Override
    public void openDoor() {
        System.out.println("电梯门开了");
        elevator.setCurrentState(elevator.getOpenState());
    }
    @Override
    public void closeDoor() {
        System.out.println("电梯门已经关了");
    }
    @Override
    public void moveUp() {
        System.out.println("电梯上升");
        elevator.setCurrentState(elevator.getMovingUpState());
    }
    @Override
    public void moveDown() {
        System.out.println("电梯下降");
        elevator.setCurrentState(elevator.getMovingDownState());
    }
    @Override
    public void stop() {
        System.out.println("电梯停止");
        elevator.setCurrentState(elevator.getStopState());
    }
}
 
/**
 * @Description: 开门状态
 * @Date: 2025-02-08 9:07
 * @Author: gaoyufei
 **/
public class OpenState implements ElevatorState{
    private Elevator elevator;
    public OpenState(Elevator elevator){
        this.elevator=elevator;
    }
    @Override
    public void openDoor() {
        System.out.println("电梯门已经打开");
    }
    @Override
    public void closeDoor() {
        System.out.println("电梯门关了");
        elevator.setCurrentState(elevator.getCloseState());
    }
    @Override
    public void moveUp() {
        System.out.println("电梯门打开状态,不能上升");
    }
    @Override
    public void moveDown() {
        System.out.println("电梯门打开状态,不能下降");
    }
    @Override
    public void stop() {
        System.out.println("电梯门打开状态,不能变换为停止状态");
    }
}
 
/**
 * @Description: 停止状态
 * @Date: 2025-02-08 9:59
 * @Author: gaoyufei
 **/
public class StopState implements ElevatorState{
    private Elevator elevator;
    public StopState(Elevator elevator){
        this.elevator=elevator;
    }
    @Override
    public void openDoor() {
        System.out.println("电梯门开了");
        elevator.setCurrentState(elevator.getOpenState());
    }
    @Override
    public void closeDoor() {
        System.out.println("电梯门关了");
        elevator.setCurrentState(elevator.getCloseState());
    }
    @Override
    public void moveUp() {
        System.out.println("电梯上升");
        elevator.setCurrentState(elevator.getMovingUpState());
    }
    @Override
    public void moveDown() {
        System.out.println("电梯下降");
        elevator.setCurrentState(elevator.getMovingDownState());
    }
    @Override
    public void stop() {
        System.out.println("电梯停止");
    }
}
/**
 * @Description: 上升状态
 * @Date: 2025-02-08 9:07
 * @Author: gaoyufei
 **/
public class MovingUpState implements ElevatorState{
    private Elevator elevator;
    public MovingUpState(Elevator elevator){
        this.elevator=elevator;
    }
    @Override
    public void openDoor() {
        System.out.println("电梯正在上升,不能开门");
    }
    @Override
    public void closeDoor() {
        System.out.println("电梯已经关门");
    }
    @Override
    public void moveUp() {
        System.out.println("电梯正在上升");
    }
    @Override
    public void moveDown() {
        System.out.println("电梯下降");
        elevator.setCurrentState(elevator.getMovingDownState());
    }
    @Override
    public void stop() {
        System.out.println("电梯停止");
        elevator.setCurrentState(elevator.getStopState());
    }
}
 
/**
 * @Description: 下降状态
 * @Date: 2025-02-08 9:08
 * @Author: gaoyufei
 **/
public class MovingDownState implements ElevatorState{
    private Elevator elevator;
    public MovingDownState(Elevator elevator){
        this.elevator=elevator;
    }
    @Override
    public void openDoor() {
        System.out.println("电梯正在下降,不能开门");
    }
    @Override
    public void closeDoor() {
        System.out.println("电梯正在下降,已经关门了");
    }
    @Override
    public void moveUp() {
        System.out.println("电梯上升");
        elevator.setCurrentState(elevator.getMovingUpState());
    }
    @Override
    public void moveDown() {
        System.out.println("电梯正在下降");
    }
    @Override
    public void stop() {
        System.out.println("电梯停止");
        elevator.setCurrentState(elevator.getStopState());
    }
}
 
/**
 * @Description: 电梯
 * @Date: 2025-02-08 9:04
 * @Author: gaoyufei
 **/
public class Elevator {
    private ElevatorState closeState;
    private ElevatorState openState;
    private ElevatorState movingDownState;
    private ElevatorState movingUpState;
    private ElevatorState stopState;
 
    private ElevatorState currentState;
 
    public Elevator(){
        closeState=new CloseState(this);
        openState=new OpenState(this);
        movingDownState=new MovingDownState(this);
        movingUpState=new MovingUpState(this);
        stopState=new StopState(this);
        currentState=closeState;// 默认初始状态为关闭状态
 
    }
    public void setCurrentState(ElevatorState currentState) {
        this.currentState = currentState;
    }
    public ElevatorState getCloseState() {
        return closeState;
    }
    public ElevatorState getOpenState() {
        return openState;
    }
    public ElevatorState getMovingDownState() {
        return movingDownState;
    }
    public ElevatorState getMovingUpState() {
        return movingUpState;
    }
    public ElevatorState getStopState() {
        return stopState;
    }
    public void openDoor(){
        currentState.openDoor();
    }
    public void closeDoor(){
        currentState.closeDoor();
    }
    public void moveUp(){
        currentState.moveUp();
    }
    public void moveDown(){
        currentState.moveDown();
    }
    public void stop(){
        currentState.stop();
    }
}
 
/**
 * @Description: 客户端
 * @Date: 2025-02-08 9:29
 * @Author: gaoyufei
 **/
public class Client {
    public static void main(String[] args) {
        //初始关闭状态
        Elevator elevator=new Elevator();
        //关门
        elevator.closeDoor();//输出 电梯门已经关了
        //开门
        elevator.openDoor();//输出 电梯门开了
        //上升
        elevator.moveUp();//输出 电梯门打开状态不能上升
        //关门
        elevator.closeDoor();//输出 电梯门关了
        //上升
        elevator.moveUp();//输出 电梯上升
        //关门
        elevator.closeDoor();//输出 电梯已经关门
        //下降
        elevator.moveDown();//输出 电梯下降
        //停止
        elevator.stop();//输出 电梯停止
        //开门
        elevator.openDoor();//输出 电梯门开了
        //停止
        elevator.stop();//输出 电梯门打开状态,不能变换为停止状态
    }
}

到此这篇关于Java实现状态模式的示例代码的文章就介绍到这了,更多相关Java 状态模式内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/java/14885.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部