发布于 2024 年 2 月 26 日,星期一
“基于状态模式:没有实践的理论都是扯淡!!!”强调了理论与实践的紧密结合。状态模式作为一种设计模式,其核心在于通过状态的变化来管理对象的行为。然而,仅仅理解状态模式的理论概念是不够的,必须通过实际项目中的应用来验证和深化理解。实践是检验理论的唯一标准,只有在实际开发中不断尝试、调试和优化,才能真正掌握状态模式的精髓。没有实践支撑的理论往往流于表面,无法解决实际问题,因此,标题呼吁开发者不仅要学习理论,更要注重实践,将理论转化为实际可行的解决方案。
状态模式是一种面向对象的设计模式,它允许一个对象在其内部状态改变时改变它对应的行为。
状态模式的关键在于如何区分事物内部的状态,事物内部状态的改变往往会带来事物的行为的改变。
状态模式的关键是把事物的每种状态都封装成单独的类,跟状态有关的行为会被封装在这个类的内部
。没有实践的理论都是扯淡
,个人很赞同。那接下来让我们用代码说话,在实际应用中实践一下吧。// 状态接口class OrderState { constructor(order) { this.order = order; } // 定义状态方法 confirm() { throw new Error("confirm() method must be implemented."); } cancel() { throw new Error("cancel() method must be implemented."); } ship() { throw new Error("ship() method must be implemented."); }}// 具体状态类:待处理状态class PendingState extends OrderState { confirm() { console.log("订单已确认"); this.order.setState(new ConfirmedState(this.order)); } cancel() { console.log("订单已取消"); this.order.setState(new CancelledState(this.order)); } ship() { console.log("无法发货,订单未确认"); }}// 具体状态类:已确认状态class ConfirmedState extends OrderState { confirm() { console.log("订单已确认"); } cancel() { console.log("订单已取消"); this.order.setState(new CancelledState(this.order)); } ship() { console.log("订单已发货"); this.order.setState(new ShippedState(this.order)); }}// 具体状态类:已发货状态class ShippedState extends OrderState { confirm() { console.log("无法确认,订单已发货"); } cancel() { console.log("无法取消,订单已发货"); } ship() { console.log("订单已发货"); }}// 具体状态类:已完成状态class CompletedState extends OrderState { confirm() { console.log("无法确认,订单已完成"); } cancel() { console.log("无法取消,订单已完成"); } ship() { console.log("无法发货,订单已完成"); }}// 具体状态类:已取消状态class CancelledState extends OrderState { confirm() { console.log("无法确认,订单已取消"); } cancel() { console.log("无法取消,订单已取消"); } ship() { console.log("无法发货,订单已取消"); }}// 上下文类:订单class Order { constructor() { // 初始化状态 this.currentState = new PendingState(this); } // 设置当前状态 setState(state) { this.currentState = state; } // 执行确认操作 confirm() { this.currentState.confirm(); } // 执行取消操作 cancel() { this.currentState.cancel(); } // 执行发货操作 ship() { this.currentState.ship(); }}// 示例用法const order = new Order();order.confirm(); // 输出: 订单已确认order.ship(); // 输出: 无法发货,订单未确认order.cancel(); // 输出: 订单已取消order.confirm(); // 输出: 订单已确认order.ship(); // 输出: 订单已发货order.confirm(); // 输出: 无法确认,订单已发货order.cancel(); // 输出: 无法取消,订单已发货order.ship(); // 输出: 订单已发货order.confirm(); // 输出: 无法确认,订单已完成
// 信号灯状态基类class TrafficLightState { constructor(light) { this.light = light; } // 状态行为方法,子类需要实现具体逻辑 display() {} stopBlinking() {}}// 红灯状态class RedLightState extends TrafficLightState { display() { console.log("红灯亮起"); this.light.setState(new GreenLightState(this.light)); }}// 绿灯状态class GreenLightState extends TrafficLightState { display() { console.log("绿灯亮起"); this.light.setState(new YellowLightState(this.light)); }}// 黄灯状态class YellowLightState extends TrafficLightState { display() { console.log("黄灯亮起"); this.light.setState(new RedLightState(this.light)); }}// 闪烁状态class BlinkingLightState extends TrafficLightState { constructor(light) { super(light); this.intervalId = null; } display() { console.log("闪烁灯亮起"); this.intervalId = setInterval(() => { this.light.toggle(); }, 500); } stopBlinking() { console.log("闪烁灯停止"); clearInterval(this.intervalId); this.light.setState(new RedLightState(this.light)); }}// 信号灯类class TrafficLight { constructor() { this.state = new RedLightState(this); this.isLightOn = false; } setState(state) { this.state = state; } display() { this.state.display(); } toggle() { this.isLightOn = !this.isLightOn; console.log(`灯光${this.isLightOn ? "亮起" : "熄灭"}`); } stopBlinking() { this.state.stopBlinking(); }}// 使用示例const trafficLight = new TrafficLight();trafficLight.display(); // 红灯亮起trafficLight.display(); // 绿灯亮起trafficLight.display(); // 黄灯亮起trafficLight.setState(new BlinkingLightState(trafficLight));trafficLight.display();/**
灯光亮起
灯光熄灭
灯光亮起
灯光熄灭
灯光亮起
*/setTimeout(() => { trafficLight.stopBlinking(); // 闪烁灯停止,变为红灯}, 3000);
// 状态接口class AudioPlayerState { constructor(audioPlayer) { this.audioPlayer = audioPlayer; } play() {} pause() {} stop() {}}// 停止状态class StopState extends AudioPlayerState { play() { console.log('开始播放音频'); // 切换到播放状态 this.audioPlayer.setState(this.audioPlayer.playState); } pause() { console.log('音频已停止,无法暂停'); } stop() { console.log('音频已停止'); }}// 播放状态class PlayState extends AudioPlayerState { play() { console.log('音频已经在播放中'); } pause() { console.log('音频已暂停'); // 切换到暂停状态 this.audioPlayer.setState(this.audioPlayer.pauseState); } stop() { console.log('音频已停止'); // 切换到停止状态 this.audioPlayer.setState(this.audioPlayer.stopState); }}// 暂停状态class PauseState extends AudioPlayerState { play() { console.log('音频已经在播放中'); } pause() { console.log('音频已经暂停'); } stop() { console.log('音频已停止'); // 切换到停止状态 this.audioPlayer.setState(this.audioPlayer.stopState); }}// 音频播放器类class AudioPlayer { constructor() { // 初始化默认状态为停止状态 this.stopState = new StopState(this); this.playState = new PlayState(this); this.pauseState = new PauseState(this); this.currentState = this.stopState; } setState(state) { this.currentState = state; } play() { this.currentState.play(); } pause() { this.currentState.pause(); } stop() { this.currentState.stop(); }}// 示例用法const audioPlayer = new AudioPlayer();audioPlayer.play(); // 开始播放音频audioPlayer.pause(); // 音频已暂停audioPlayer.play(); // 音频已经在播放中audioPlayer.stop(); // 音频已停止audioPlayer.stop(); // 音频已停止