状态模式 电梯

简介: 状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。状态模式将对象的行为封装到不同的状态类中,每个状态类都实现了对象在该状态下具体的行为。当对象的状态发生改变时,它会自动切换到相应的状态类,从而改变它的行为。

状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。状态模式将对象的行为封装到不同的状态类中,每个状态类都实现了对象在该状态下具体的行为。当对象的状态发生改变时,它会自动切换到相应的状态类,从而改变它的行为。

状态模式的核心思想是将对象的行为和状态分离,将不同的状态封装到不同的状态类中,让对象在运行时可以自由切换状态,从而实现不同的行为。

下面是一个简单的状态模式的Demo,假设有一个电梯系统,它可以处于三种状态:运行状态、停止状态和维修状态。在不同的状态下,电梯的行为是不同的。

python
Copy

状态抽象类

class ElevatorState:
def open_door(self):
pass

def close_door(self):
    pass

def go_up(self):
    pass

def go_down(self):
    pass

运行状态类

class RunningState(ElevatorState):
def open_door(self):
print("电梯正在运行,无法开门。")

def close_door(self):
    print("电梯正在运行,门已经关闭。")

def go_up(self):
    print("电梯正在上行。")

def go_down(self):
    print("电梯正在下行。")

停止状态类

class StoppedState(ElevatorState):
def open_door(self):
print("电梯门已经打开。")

def close_door(self):
    print("电梯门已经关闭。")

def go_up(self):
    print("电梯开始上行。")

def go_down(self):
    print("电梯开始下行。")

维修状态类

class MaintenanceState(ElevatorState):
def open_door(self):
print("电梯正在维修中,无法开门。")

def close_door(self):
    print("电梯正在维修中,门已经关闭。")

def go_up(self):
    print("电梯正在维修中,无法运行。")

def go_down(self):
    print("电梯正在维修中,无法运行。")

电梯类

class Elevator:
def init(self):
self.running_state = RunningState()
self.stopped_state = StoppedState()
self.maintenance_state = MaintenanceState()

    self.current_state = self.stopped_state

def set_state(self, state):
    self.current_state = state

def open_door(self):
    self.current_state.open_door()

def close_door(self):
    self.current_state.close_door()

def go_up(self):
    self.current_state.go_up()

def go_down(self):
    self.current_state.go_down()

客户端代码

elevator = Elevator()

elevator.open_door() # 电梯门已经打开。
elevator.close_door() # 电梯门已经关闭。
elevator.go_up() # 电梯开始上行。

elevator.set_state(elevator.running_state)
elevator.go_up() # 电梯正在上行。
elevator.open_door() # 电梯正在运行,无法开门。

elevator.set_state(elevator.maintenance_state)
elevator.go_up() # 电梯正在维修中,无法运行。
elevator.open_door() # 电梯正在维修中,无法开门。
在这个Demo中,ElevatorState是状态抽象类,定义了电梯在不同状态下的行为接口。RunningState、StoppedState和MaintenanceState是具体的状态类,它们分别实现了不同状态下的行为接口。Elevator是电梯类,它通过组合状态类实现状态的切换和行为的改变。

当客户端使用状态模式时,需要先定义一个状态抽象类,然后实现具体的状态类,每个状态类都封装了一种状态下的行为。状态模式的应用场景比较广泛,例如:

电梯系统:如上面的示例,电梯系统可以根据不同的状态实现不同的行为。
游戏系统:游戏中的角色、怪物等可以根据不同的状态实现不同的行为,例如攻击、逃跑、防御等。
购物车系统:购物车可以根据不同的状态实现不同的行为,例如添加商品、删除商品、结算等。
线程池系统:线程池可以根据不同的状态实现不同的行为,例如运行、暂停、停止等。
总之,状态模式适用于对象的行为随着内部状态的改变而改变的场景,它可以使对象的行为更加灵活和可扩展。

以下是一些推荐的学习资料和链接,可以帮助你更好地学习状态模式:

《Head First 设计模式》:这是一本非常通俗易懂的设计模式入门书籍,其中包含了对状态模式的讲解和示例代码。
《设计模式:可复用面向对象软件的基础》:这是设计模式的经典著作之一,其中包含了对状态模式的详细讲解和示例代码。
《图解设计模式:以UML为基础,学习23种设计模式》:这是一本以图解为主的设计模式入门书籍,其中包含了对状态模式的详细讲解和示例代码。
状态模式的Java实现:这是一个包含了状态模式示例代码的Java项目,可以帮助读者更好地理解和应用状态模式。
GitHub链接:https://github.com/iluwatar/java-design-patterns/tree/master/state
总之,学习状态模式需要结合书籍和实践,建议读者选择一些适合自己的入门书籍,同时结合实际项目中的设计问题进行实践,加深对状态模式的理解和应用。

目录
相关文章
|
数据可视化
R语言多图合成:优雅地在一个画布上展示多个图形
【8月更文挑战第30天】R语言提供了多种方法来实现多图合成,从基础的`par()`函数到高级的`gridExtra`、`ggplot2`和`cowplot`包,每种方法都有其独特的优势和应用场景。通过掌握这些技术,你可以根据实际需求灵活地组合图形,从而更高效地展示和解读数据。希望本文能为你提供一些有益的参考和启示。
|
消息中间件 存储 分布式计算
|
算法 程序员 C++
【C/C++ 泛型编程 应用篇】C++ 对多参数的参数包的 参数类型提取 应用
【C/C++ 泛型编程 应用篇】C++ 对多参数的参数包的 参数类型提取 应用
215 5
|
12月前
|
机器学习/深度学习 存储 搜索推荐
GBDT+LR简介
GBDT+LR简介
173 0
|
算法 网络安全 开发工具
TLS/SSL 协议-非对称加密(RSA)原理
TLS/SSL 协议-非对称加密(RSA)原理
559 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的校园二手书交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的校园二手书交易平台的详细设计和实现(源码+lw+部署文档+讲解等)
240 1
|
数据可视化 数据挖掘 数据处理
淘宝天猫玩具销售数据可视化(上)
淘宝天猫玩具销售数据可视化
440 1
|
tengine 运维 Kubernetes
阿里巴巴重磅开源云原生网关: Higress
11月5日,2022 杭州 · 云栖大会-云原生峰会现场,阿里巴巴研究员、阿里云智能云原生应用平台总经理丁宇宣布:云原生网关 Higress 正式开源,Higress 是一款标准化、高集成、易扩展、热更新的云原生网关。
920 96
阿里巴巴重磅开源云原生网关: Higress
|
SQL 存储
MySQL-多表联合查询
MySQL-多表联合查询
|
算法 Serverless 语音技术
Mel-Frequency Cepstral Coefficients,简称 MFCCs
频率倒谱系数(Mel-Frequency Cepstral Coefficients,简称 MFCCs)是一种在语音信号处理中常用的特征提取方法。MFCCs 是通过对语音信号进行傅里叶变换
264 1