行为型模式-状态模式
状态模式(State)
解决对象状态转换问题
描述
通过将对象的状态封装成不同的类,从而使得对象在不同状态下能够有不同的行为。这种方式可以避免大量的条件语句或者switch-case结构,同时也能够提高系统的可维护性和可扩展性。
适用环境
当一个对象的行为取决于其内部状态时使用;当需要根据状态改变对象的行为时使用。
优点:
避免了使用条件语句来判断对象的状态,提高了系统的可维护性和可扩展性;将所有与状态相关的行为都封装在了状态类中,使得代码更加清晰。
缺点:
对于状态比较多的对象,可能会导致系统的复杂度增加;状态模式可能会导致类的数量增加。
违反原则
开放-封闭原则:如果需要增加新的状态,则需要修改所有的状态类,违反该原则。
代码实现
使用一个电子阅读器阅书籍为了能够在黑暗的环境下也能够轻松地阅读因此需要添加一个夜间模式
将背景颜色和字体颜色调整为更适合夜间阅读的颜色,可以使用状态模式来解决这个问题
创建一个名为Display的类,定义多个状态类来表示不同的显示状态,白天模式 夜间模式
当想要切换到另一个状态时Display类都会自动更新其当前状态并相应地改变背景颜色和字体颜色。以下是具体实现:
from abc import ABC, abstractmethod
class DisplayState(ABC):
@abstractmethod
def set_display(self, display):
pass
@abstractmethod
def switch_mode(self):
pass
class DayMode(DisplayState):
def set_display(self, display):
self.display = display
def switch_mode(self):
print("切换至夜间模式")
self.display.set_state(NightMode())
class NightMode(DisplayState):
def set_display(self, display):
self.display = display
def switch_mode(self):
print("切换至白天模式")
self.display.set_state(DayMode())
class Display:
def __init__(self):
self.state = DayMode()
self.state.set_display(self)
def set_state(self, state):
self.state = state
self.state.set_display(self)
def switch_mode(self):
self.state.switch_mode()
class Book:
def __init__(self, title):
self.title = title
self.display = Display()
def switch_mode(self):
self.display.switch_mode()
在代码中创建了五个类:
DisplayState:状态抽象类定义了set_display和switch_mode方法
DayMode、NightMode:具体的状态类分别表示白天模式和夜间模式
Display:显示类用于管理不同的显示状态
Book:书籍类包含了电子阅读器的显示设置
通过使用状态模式可以切换到不同的显示模式,当想要切换显示模式时只需要调用Book类的switch_mode()方法
该方法将自动更新电子阅读器的显示状态并相应地改变背景颜色和字体颜色。如果想要切换回之前的显示模式只需要调用switch_mode()方法即可