状态模式 电梯

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

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

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

下面是一个简单的状态模式的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
总之,学习状态模式需要结合书籍和实践,建议读者选择一些适合自己的入门书籍,同时结合实际项目中的设计问题进行实践,加深对状态模式的理解和应用。

目录
相关文章
|
监控 druid Java
监控druid数据库连接池连接泄露的思路
监控druid数据库连接池连接泄露的思路
1592 2
|
自然语言处理 算法 编译器
编译原理复习一:正则表达式-NFA NFA-DFA DFA最小化(附题目与答案 超详细)
编译原理复习一:正则表达式-NFA NFA-DFA DFA最小化(附题目与答案 超详细)
1009 0
|
11月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
437 6
|
11月前
|
缓存 Java
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
本文介绍了几种常见的锁机制,包括公平锁与非公平锁、可重入锁与不可重入锁、自旋锁以及读写锁和互斥锁。公平锁按申请顺序分配锁,而非公平锁允许插队。可重入锁允许线程多次获取同一锁,避免死锁。自旋锁通过循环尝试获取锁,减少上下文切换开销。读写锁区分读锁和写锁,提高并发性能。文章还提供了相关代码示例,帮助理解这些锁的实现和使用场景。
277 4
java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
解决java.lang.IllegalStateException: Failed to load ApplicationContext错误~
解决java.lang.IllegalStateException: Failed to load ApplicationContext错误~
1114 0
|
12月前
|
资源调度 前端开发 JavaScript
前端研发链路之脚手架
本文首发于微信公众号“前端徐徐”。文章介绍了前端开发中脚手架工具的重要性及其工作原理。脚手架工具能够大幅提升开发效率,确保代码质量和项目一致性。文章详细探讨了脚手架的历史、工作原理、常见工具及其优势与潜在问题,并展望了其未来发展方向,帮助开发者更好地理解和应用脚手架工具。
298 4
前端研发链路之脚手架
|
Java 数据库连接 数据库
Spring 与【MyBatis 】和【 pageHelper分页插件 】整合
Spring 与【MyBatis 】和【 pageHelper分页插件 】整合
377 0
|
存储 数据采集 DataWorks
DataWorks产品使用合集之如何结合MDM进行主数据项目实施
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
187 1
|
算法 搜索推荐 数据挖掘
掌握程序员之剑:解析常见算法与其在生活和工作中的影响
掌握程序员之剑:解析常见算法与其在生活和工作中的影响
194 1
|
JavaScript 前端开发 Java
node.js环境安装以及Vue-CLI脚手架搭建项目教程
node.js环境安装以及Vue-CLI脚手架搭建项目教程
1044 0