Olá. Eu estava vendo o design pattern State e me incomodou a forma de transição entre os estados. Cada estado tem seu próprio método incluso em TODAS as classes de estado sendo obrigatórias por serem métodos abstratos da classe pai. A maioria dali lança exceção, a única vantagem que eu enxerguei foi de retornar uma mensagem específica.
Talvez eu não tenha enxergado a praticidade disso, mas eu faria diferente.
Eu faria um método genérico de mudança de estado que recebesse como parâmetro uma classe de estado ou uma instância do estado desejado. A classe do estado atual teria uma lista de estados aceitos para transitar (ou o inverso caso a implementação fique melhor - no caso, estados proibidos). Portanto, é feita a mudança para o estado que veio como parâmetro caso ele passe na condição.
Exemplo:
class Estado_1(Classe_pai):
estados_transitaveis = [Estado_2, Estado_7]
def muda_estado(self, Classe_estado):
if Classe_estado in estados_transitaveis:
self.estado_atual = Classe_estado()
else:
raise Exception("Não é possível a mudança de estado de %s para %s".format(str(self.estado_atual), str(Classe_estado))
Nota, pode ter algum erro sintático pq não testei 100%, mas creio que passei a ideia.
Quero saber se concordam comigo ou se eu deixei algo importante passar nomeu intendimento desse pattern na parte de transição de estados.