一、简介
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俱乐部!