Python:设计模式之状态模式

简介: Python:设计模式之状态模式

状态设计模式

属于行为模式

一个对象可以基于其内部状态封装多个行为,状态模式也可以被看做是在运行时改变对象行为的一种方式

状态设计模式的3个主要参与者

1、State: 封装对象行为的接口,这个行为与对象的状态相关联

2、ConcreteState: 实现State 接口的子类,ConcreteState 实现与对象的特定状态相关联的实际行为

3、Context:定义了客户感兴趣的接口,Context还维护了一个ConcreteState 子类的实例,

该子类在内部定义了对象的特定状态的实现


简单实例

电视机开机,关机

# -*- coding: utf-8 -*-
from abc import ABCMeta, abstractmethod
class State(metaclass=ABCMeta):
    @abstractmethod
    def do_this(self):
        pass
class StartState(State):
    def do_this(self):
        print("start state")
class StopState(State):
    def do_this(self):
        print("stop state")
class TVContext(State):
    def __init__(self):
        self.state = None
    def get_state(self):
        return self.state
    def set_state(self, state):
        self.state = state
    def do_this(self):
        self.state.do_this()
if __name__ == '__main__':
    context = TVContext()
    start = StartState()
    stop = StopState()
    context.set_state(start)
    context.do_this()
    context.set_state(stop)
    context.do_this()
"""
start state
stop state
"""

3种状态切换示例

电脑开机,待机,关机

# -*- coding: utf-8 -*-
# 接口
class ComputerState(object):
    name = "state"
    allowed = []
    def switch(self, state):
        if state.name in self.allowed:
            print("switch state: {}".format(state.name))
            self.__class__ = state
        else:
            print("state not allowed")
    def __str__(self):
        return self.name
# 具体实现
# 开机
class On(ComputerState):
    name = "on"
    allowed = ["off", "hibernate"]
# 关机
class Off(ComputerState):
    name = "off"
    allowed = ["on"]
# 休眠
class Hibernate(ComputerState):
    name = "hibernate"
    allowed = ["on", "off"]
# 客户端
class Computer(object):
    def __init__(self):
        self.state = Off()  # 初始状态是关机状态
    def change(self, state):
        self.state.switch(state)
if __name__ == '__main__':
    computer = Computer()
    # 开机 -> 休眠 -> 关机
    computer.change(On)
    computer.change(Hibernate)
    computer.change(Off)
    # 关机的请情况下休眠
    computer.change(Hibernate)
"""
switch state: on
switch state: hibernate
switch state: off
state not allowed
"""

状态模式的优点

1、状态设计模式中,对象的行为是其状态函数结果,并且行为在运行时根据状态而改变

消除了对if/else 或 switch/case 条件逻辑的依赖

2、使用状态模式,实现多态行为,更易于添加转态来支持额外的行为

3、状态设计模式还提高了聚合性,特定于状态的行为被聚合到实现类ConcreteState 中,

并且放置在代码的同一个地方

4、状态模式,通过只添加一个 ConcreteState 类来添加行为非常容易,

不仅改善了扩展应用程序行为时的灵活性,而且全面提高了代码的可维护性

状态模式的缺点

1、类爆炸,由于每个状态都要在ConcreteState 类的帮助下定义,因此可能导致创建了太多功能较为单一的类

2、随着每个新行为的引入,Context类都将需要进行相应的更新以处理每个行为,

这使得上下文行为更容易受到每个新的行为影响


参考

《Python设计模式第2版》第十章 状态设计模式

相关文章
|
10天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
12天前
|
设计模式 监控 数据库连接
Python编程中的设计模式之美:提升代码质量与可维护性####
【10月更文挑战第21天】 一段简短而富有启发性的开头,引出文章的核心价值所在。 在编程的世界里,设计模式如同建筑师手中的蓝图,为软件的设计和实现提供了一套经过验证的解决方案。本文将深入浅出地探讨Python编程中几种常见的设计模式,通过实例展示它们如何帮助我们构建更加灵活、可扩展且易于维护的代码。 ####
|
20天前
|
设计模式 开发者 Python
Python编程中的设计模式:从入门到精通####
【10月更文挑战第14天】 本文旨在为Python开发者提供一个关于设计模式的全面指南,通过深入浅出的方式解析常见的设计模式,帮助读者在实际项目中灵活运用这些模式以提升代码质量和可维护性。文章首先概述了设计模式的基本概念和重要性,接着逐一介绍了几种常用的设计模式,并通过具体的Python代码示例展示了它们的实际应用。无论您是Python初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和实用的技巧。 ####
|
17天前
|
设计模式 开发者 Python
Python编程中的设计模式应用与实践###
【10月更文挑战第18天】 本文深入探讨了Python编程中设计模式的应用与实践,通过简洁明了的语言和生动的实例,揭示了设计模式在提升代码可维护性、可扩展性和重用性方面的关键作用。文章首先概述了设计模式的基本概念和重要性,随后详细解析了几种常用的设计模式,如单例模式、工厂模式、观察者模式等,在Python中的具体实现方式,并通过对比分析,展示了设计模式如何优化代码结构,增强系统的灵活性和健壮性。此外,文章还提供了实用的建议和最佳实践,帮助读者在实际项目中有效运用设计模式。 ###
11 0
|
20天前
|
设计模式 存储 数据库连接
Python编程中的设计模式之美:单例模式的妙用与实现###
本文将深入浅出地探讨Python编程中的一种重要设计模式——单例模式。通过生动的比喻、清晰的逻辑和实用的代码示例,让读者轻松理解单例模式的核心概念、应用场景及如何在Python中高效实现。无论是初学者还是有经验的开发者,都能从中获得启发,提升对设计模式的理解和应用能力。 ###
|
2月前
|
设计模式
python24种设计模式
python24种设计模式
|
2月前
|
设计模式 Java 测试技术
Java设计模式-状态模式(18)
Java设计模式-状态模式(18)
|
3月前
|
设计模式 XML 数据格式
python之工厂设计模式
python之工厂设计模式
python之工厂设计模式
|
3月前
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
3月前
|
设计模式 存储 数据库连接
Python设计模式:巧用元类创建单例模式!
Python设计模式:巧用元类创建单例模式!
47 0

热门文章

最新文章

  • 1
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    44
  • 2
    C++一分钟之-C++中的设计模式:单例模式
    51
  • 3
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    36
  • 4
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    59
  • 5
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    54
  • 6
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    39
  • 7
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 8
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    102
  • 9
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    74
  • 10
    Go语言设计模式:使用Option模式简化类的初始化
    71