The before code uses if-else to switch behavior based on a string state, which becomes hard to maintain as states grow. The after code defines a State interface and concrete State classes. The Context delegates behavior to the current State object, which changes the Context's state dynamically. This improves extensibility and readability.
### Before: Using conditionals
class Context:
def __init__(self):
self.state = 'A'
def request(self):
if self.state == 'A':
print('Behavior for state A')
self.state = 'B'
elif self.state == 'B':
print('Behavior for state B')
self.state = 'A'
context = Context()
context.request() # Behavior for state A
context.request() # Behavior for state B
### After: Using State pattern
from abc import ABC, abstractmethod
class State(ABC):
@abstractmethod
def handle(self, context):
pass
class StateA(State):
def handle(self, context):
print('Behavior for state A')
context.state = StateB()
class StateB(State):
def handle(self, context):
print('Behavior for state B')
context.state = StateA()
class Context:
def __init__(self):
self.state = StateA()
def request(self):
self.state.handle(self)
context = Context()
context.request() # Behavior for state A
context.request() # Behavior for state B