首页 > 其他分享 >状态模式的精髓是什么

状态模式的精髓是什么

时间:2024-07-04 20:19:34浏览次数:13  
标签:__ 状态 handle 对象 self 精髓 模式 switch

状态模式(State Pattern)的精髓在于将对象的行为包装在状态对象中,并通过状态对象改变对象的行为。它允许对象在内部状态改变时改变其行为,使得对象看起来好像修改了其类。

核心思想

  1. 状态封装

    • 将不同状态下的行为封装到不同的状态类中,避免了大量的条件语句(如 ifswitch)。
  2. 状态转移

    • 通过状态类的接口,允许状态对象在内部状态发生改变时切换到另一个状态。
  3. 行为变化

    • 对象的行为随着其内部状态的改变而改变。状态模式将这些变化分散到各个状态类中,使得代码更清晰和易于维护。

状态模式的结构

状态模式的典型结构包括以下几个部分:

  1. Context(上下文)

    • 维护一个当前状态的实例,并将请求委托给当前状态对象处理。
  2. State(状态接口或抽象类)

    • 定义状态类的接口,具体状态需要实现该接口。
  3. ConcreteState(具体状态)

    • 实现状态接口的具体状态类,不同状态实现不同的行为。

状态模式的 UML 图

 +---------+            +-----------------+
 | Context |<>----------| State           |
 +---------+            +-----------------+
 | state   |            | + handle()      |
 +---------+            +-----------------+
      |                       ^
      |                       |
      v                       |
 +------------------+  +------------------+
 | ConcreteStateA   |  | ConcreteStateB   |
 +------------------+  +------------------+
 | + handle()       |  | + handle()       |
 +------------------+  +------------------+

示例代码

下面是一个简单的状态模式示例,模拟一个电灯的状态(开和关):

状态接口

from abc import ABC, abstractmethod

class State(ABC):
    @abstractmethod
    def handle(self, context):
        pass

具体状态类

class OnState(State):
    def handle(self, context):
        print("Turning off the light.")
        context.state = OffState()

class OffState(State):
    def handle(self, context):
        print("Turning on the light.")
        context.state = OnState()

上下文类

class LightSwitch:
    def __init__(self):
        self.state = OffState()

    def press(self):
        self.state.handle(self)

使用示例

if __name__ == "__main__":
    switch = LightSwitch()
    
    switch.press()  # Turning on the light.
    switch.press()  # Turning off the light.
    switch.press()  # Turning on the light.
    switch.press()  # Turning off the light.

状态模式的优点

  1. 减少条件语句

    • 通过状态类的多态性,减少了复杂的条件判断语句,使得代码更加简洁和可维护。
  2. 扩展性好

    • 新增状态类时,只需要添加新的状态类,不需要修改现有的状态类和上下文类,符合开闭原则。
  3. 封装性好

    • 状态转换的逻辑封装在具体状态类中,清晰且独立,便于理解和维护。

适用场景

  • 对象的行为依赖于其状态,并且必须在运行时根据状态改变其行为。
  • 代码中包含大量与对象状态有关的条件语句(如 ifswitch),这些条件语句依赖于对象的状态。

结论

状态模式通过将状态转换和行为封装在独立的状态类中,使得对象行为的变化变得简单而有序,极大地提高了代码的可读性和可维护性。它在实现对象状态转换、简化复杂条件判断方面有着显著的优势,是面向对象设计中非常重要的一种设计模式。

标签:__,状态,handle,对象,self,精髓,模式,switch
From: https://www.cnblogs.com/gongchengship/p/18284609

相关文章

  • 如何启动一个 server 模式的 h2 数据库
    要启动一个server模式的H2数据库,可以按照以下步骤操作:准备工作下载H2数据库:首先,您需要从H2数据库的官方网站下载H2数据库的JAR文件。访问H2DatabaseEngine并下载最新版本的h2-x.x.x.jar文件。Java环境:确保您的计算机上安装了Java环境(JRE或JDK),并配......
  • 设计模式-设计原则与设计模式总结
    设计原则,是设计模式的基础。在实际开发中,并不是一定要求所有代码都遵循设计原则,我们需要综合考虑人力、时间、成本、质量,不是可以追求完美,要在设当的场景遵循合适的设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。设计模式(DesignPattern)是前辈们经过相当长的......
  • 设计模式-访问者模式
    访问者模式访问者模式(VisitorPattern)是一种将数据结构与数据操作分离的设计模式,是指封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作,属于行为型模式。访问者模式被称为最复杂的设计模式,但是使用率不高。不过,一旦你需要......
  • 香橙派 AIpro搭建1Panel运维管理面板实现高效直观的设备状态监控
    ......
  • flutter状态管理 provider使用
    provider是flutter官方推荐的状态管理插件,是基于InheritedWidget实现的。下面我们来讲一个provider的使用方法。1.在pubspec.yaml文件中添加provider:^6.1.2开发文档:https://pub-web.flutter-io.cn/packages/provider可以查看使用方法和最新版本号。添加完成后,进行保......
  • 【设计模式(三)】创建型模式--单例模式
    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。饿汉式类加载就会导致该单实例对象被创建/***饿汉式*静态变量创建类的对象*/publicclassSingleton{//......
  • 详解五种Docker容器的网络模式
    Docker网络设置了容器如何与其他容器和外部服务通信。为了获得网络访问,容器需要是Docker网络的一部分。容器可以通信的方式取决于它的网络连接。Docker提供了五种标准网络模式来执行核心网络功能:Bridge(桥接)Host(主机)Overlay(重叠)IPvLANMacvl......
  • STM32 低功耗模式 睡眠、停止和待机 详解
    STM32提供了三种低功耗模式,分别是睡眠模式(SleepMode)、停止模式(StopMode)和待机模式(StandbyMode),我们在做一些电池供电项目的时候,低功耗模式显得尤为重要。模式名称进入唤醒唤醒后位置对1.2V域时钟的影响对VDD域时钟的影响功耗睡眠模式WFI任意中断睡眠位置开始执行CPU/CLK......
  • 报名参课 | 解锁 Serverless+AI 新模式,拥有专属AIGC环境
    如今,Serverless被越来越多的企业所接受,并应用于业务实践中。科技的每一次进步都在更新着我们的工作模式,除了互联网企业最早“尝鲜”之外,传统企业也在探索大规模使用Serverless。越来越多人迈过了对Serverless技术的初级认知阶段,走向了落地实践。Serverless和AI大模型都是......
  • 设计模式实现思路介绍
    设计模式是在软件工程中用于解决特定问题的典型解决方案。它们是在多年的软件开发实践中总结出来的,并且因其重用性、通用性和高效性而被广泛接受。设计模式通常被分为三种主要类型:创建型、结构型和行为型。创建型设计模式创建型设计模式专注于如何创建对象,以确保系统在创......