发布于 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(); // 音频已停止