状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。状态模式将对象的行为封装到不同的状态类中,每个状态类都实现了对象在该状态下具体的行为。当对象的状态发生改变时,它会自动切换到相应的状态类,从而改变它的行为。
状态模式的核心思想是将对象的行为和状态分离,将不同的状态封装到不同的状态类中,让对象在运行时可以自由切换状态,从而实现不同的行为。
下面是一个简单的状态模式的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 ↗
总之,学习状态模式需要结合书籍和实践,建议读者选择一些适合自己的入门书籍,同时结合实际项目中的设计问题进行实践,加深对状态模式的理解和应用。