状态模式和策略模式都是设计模式,但是它们的应用场景不同。状态模式用于处理对象在内部状态改变时,改变其行为的场景。而策略模式则是将变化的部分抽离出来,组合进类中,根据不同的需求,可以动态改变行为 。
在软件开发中,我们经常会遇到各种各样的问题,例如界面的更新、数据的变化等,为了解决这些问题,我们可以使用各种设计模式,我们要讨论的是状态模式,状态模式是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为,这种模式可以让我们的代码更加清晰、易于理解和维护。
状态模式的核心思想是将一个对象的状态封装成一个独立的类,并让这个类继承自一个抽象的状态类,每个具体状态类都实现了一个与当前对象相关的行为,当需要改变对象的状态时,只需创建一个新的状态对象即可,这种方式可以让我们避免使用过多的if-else语句,使代码更加简洁。
下面我们通过一个简单的例子来说明状态模式的用法,假设我们有一个银行账户系统,我们需要实现存款、取款和查询余额的功能,我们定义一个抽象状态类BankState:
from abc import ABC, abstractmethod class BankState(ABC): @abstractmethod def deposit(self, amount): pass @abstractmethod def withdraw(self, amount): pass @abstractmethod def check_balance(self): pass
我们定义三个具体的状态类:NormalState(正常状态)、OverdraftState(透支状态)和ClosedState(关闭状态),这些类都实现了BankState接口,并分别定义了存款、取款和查询余额的具体操作:
class NormalState(BankState): def deposit(self, amount): return "存款成功,当前余额:{}".format(self.balance + amount) def withdraw(self, amount): if self.balance >= amount: self.balance -= amount return "取款成功,当前余额:{}".format(self.balance) else: return "余额不足" def check_balance(self): return "当前余额:{}".format(self.balance) class OverdraftState(BankState): def deposit(self, amount): self.balance += amount return "存款成功,当前余额:{}".format(self.balance) def withdraw(self, amount): if self.balance >= amount: self.balance -= amount return "取款成功,当前余额:{}".format(self.balance) else: return "透支失败" def check_balance(self): return "当前余额:{}".format(self.balance) class ClosedState(BankState): def deposit(self, amount): return "账户已关闭,无法存款" def withdraw(self, amount): return "账户已关闭,无法取款" def check_balance(self): return "账户已关闭,无法查询余额"
我们定义一个Bank类,它包含一个状态对象和一个执行器对象,执行器对象负责根据当前状态执行相应的操作:
class Bank: def __init__(self): self.state = NormalState() self.executor = {"deposit": self.state.deposit, "withdraw": self.state.withdraw, "check_balance": self.state.check_balance}
我们可以创建一个Bank对象,并通过执行器对象执行存款、取款和查询余额的操作:
bank = Bank() print(bank.executor["deposit"](1000)) # 存款成功,当前余额:1000 print(bank.executor["withdraw"](2000)) # 透支失败,当前余额:8000 (因为初始状态下没有设置透支阈值) print(bank.executor["check_balance"]) # 当前余额:8000 (正常状态下查询余额的结果)