📜  状态设计模式(1)

📅  最后修改于: 2023-12-03 15:40:50.091000             🧑  作者: Mango

状态设计模式

状态设计模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变其行为。

模式解析

状态设计模式是一种通过封装不同状态的行为来改变对象行为的动态策略。该模式包括:

  1. 环境(Context):定义客户端感兴趣的接口。维护一个对于当前状态的引用。
  2. 抽象状态(State):定义一个接口用于封装与环境(Context)的一个特定状态相关的行为。
  3. 具体状态(Concrete State):实现抽象状态(State)的行为。
## UML类图

![state_design_pattern](https://user-images.githubusercontent.com/46163555/133351835-2568c64d-b9af-4a85-8030-8e36ae47f1fe.png)
示例

假设一个电梯控制系统,现在需要根据不同的状态来改变电梯的行为。

from abc import ABC, abstractmethod

# 抽象状态
class State(ABC):

    @abstractmethod
    def open(self):
        pass

    @abstractmethod
    def close(self):
        pass

    @abstractmethod
    def run(self):
        pass

    @abstractmethod
    def stop(self):
        pass

# 具体状态
class Open(State):
    def open(self):
        print("电梯已经开了!")
    
    def close(self):
        print("电梯即将关门!")
        return Close()
    
    def run(self):
        print("电梯正在运行!")
        return Run()
    
    def stop(self):
        print("电梯正在停止!")
        return Stop()

class Close(State):
    def open(self):
        print("电梯即将打开!")
        return Open()
        
    def close(self):
        print("电梯已经关了!")
    
    def run(self):
        print("电梯即将运行!")
        return Run()
    
    def stop(self):
        print("电梯已经停止!")
        return Stop()


class Run(State):
    def open(self):
        print("电梯正在运行!")

    def close(self):
        print("电梯正在运行!")
        
    def run(self):
        print("电梯正在运行!")
    
    def stop(self):
        print("电梯即将停止!")
        return Stop()

class Stop(State):
    def open(self):
        print("电梯已经停止!")
        return Open()
    
    def close(self):
        print("电梯已经停止!")
    
    def run(self):
        print("电梯正在停止!")
    
    def stop(self):
        print("电梯已经停止!")


# 环境
class Context:
    def __init__(self):
        self.state = Stop()  # 初始化状态为停止状态
        
    def setState(self, state):
        self.state = state
        
    def open(self):
        self.state = self.state.open()
        
    def close(self):
        self.state = self.state.close()
        
    def run(self):
        self.state = self.state.run()
        
    def stop(self):
        self.state = self.state.stop()
        
        
if __name__ == '__main__':
    c = Context()
    
    c.open()   # 电梯已经开了!
    c.close()  # 电梯即将关门!
    c.run()    # 电梯正在运行!
    c.stop()   # 电梯即将停止!
优点和缺点
优点
  • 将状态封装进类,便于客户端调用;
  • 增加新的状态时无需修改原有代码,符合"开闭原则";
  • 促进了程序的松耦合,有利于程序的扩展。
缺点
  • 状态设计模式会增加程序的复杂度,不适合简单的应用场景。
适用场合
  • 当一个对象的行为取决于它的状态,并且必须在运行时根据其状态改变其行为时;
  • 当一个对象必须根据其状态进行一组复杂的操作,这些操作可能在每个状态中不同时。
总结

状态设计模式是一种优秀的软件架构模式,通过把状态封装进类中,使程序更容易扩展和维护。然而,由于这种模式会增加程序的复杂度,不适合简单的应用场合,需要在实际应用中进行取舍。