State pattern com android
O State é um padrão de projeto comportamental que permite que um objeto altere seu comportamento quando seu estado interno muda. Parece como se o objeto mudasse de classe.
- GOF, Design Patterns
Se tivermos que alterar o comportamento de um objeto com base em seu estado, podemos ter uma variável de estado no Objeto e usar o bloco de condição if-else para realizar diferentes ações com base no estado.
O State pattern é usado para fornecer uma maneira sistemática e desacoplada de conseguir isso por meio de implementações de Contexto e Estado.
Sempre que houver muitos estados para definir o comportamento de um objeto ou classe, é necessário usar uma máquina de estados. O conceito é concebido como uma máquina abstrata que deve estar em um de um número finito de estados, mas esta implementação deve seguir alguns conceitos para evitar implementações gigantes e de difícil manutenção.
Get Gabriel Fernandes Lemos’s stories in your inbox
Join Medium for free to get updates from this writer.
As declarações if dentro de um contexto de mudança de comportamento podem levar a um crescimento infinito de classes e métodos; cada novo estado requer sua própria adição a uma estrutura já grande e complexa. As implementações de máquina de estado, que são mais enxutas, tendem a facilitar a manutenção e evitar a deformação de um método ou classe
Estrutura:
Exemplo de padrão de estado
Vamos dar um exemplo de cenário usando um celular. Com relação aos alertas, um celular pode estar em diferentes estados. Por exemplo, vibração e silêncio. Com base neste estado de alerta, o comportamento do móvel muda quando um alerta deve ser feito. Qual é um cenário adequado para o padrão de design de estado.
- MobileAlertState : Esta interface representa os diferentes estados envolvidos. Todos os estados devem implementar esta interface.
- AlertStateContext : essa classe mantém o estado atual e é o núcleo do padrão de design de estado. Um cliente deve acessar/executar toda a configuração através desta classe.
- Vibração : Representação de um estado implementando o objeto de estado abstrato. Semelhante a isso, temos as classes Silencioso e Som
Exemplo em Kotlin:
interface MobileAlertState {
fun alert(ctx: AlertStateContext)
}
class AlertStateContext {
private var currentState: MobileAlertState? = null
init {
currentState = Vibration()
}
fun setState(state: MobileAlertState) {
currentState = state
}
fun alert() {
currentState!!.alert(this)
}
}
class Vibration : MobileAlertState {
override fun alert(ctx: AlertStateContext) {
println("vibration...")
}
}
class Silent : MobileAlertState {
override fun alert(ctx: AlertStateContext) {
println("silent...")
}
}
class Sound : MobileAlertState {
override fun alert(ctx: AlertStateContext) {
println("tu..tu..tu..tu")
}
}
fun main(args: Array<String>) {
val stateContext = AlertStateContext()
stateContext.alert()
stateContext.alert()
stateContext.setState(Silent())
stateContext.alert()
stateContext.alert()
stateContext.setState(Sound())
stateContext.alert()
}A saída do padrão de design Kotlin State
vibration...
vibration...
silent...
silent...
tu..tu..tu..tuPrós e contras
- Princípio de responsabilidade única. Organiza o código relacionado a estados particulares em classes separadas.
- Princípio aberto/fechado. Introduz novos estados sem mudar classes de estado ou contexto existentes.
- Simplifica o código de contexto ao eliminar condicionais de máquinas de estado pesadas.
- Aplicar o padrão pode ser um exagero se a máquina de estado só tem alguns estados ou raramente muda eles.
Projeto que utiliza o state pattern:
Referências:
- https://sourcemaking.com/design_patterns/state/java/1
- https://in-kotlin.com/design-patterns/strategy-and-state/
- https://chercher.tech/kotlin/state-design-pattern-kotlin#:~:text=The%20State%20design%20pattern%20is,actions%20based%20on%20the%20state.
- https://refactoring.guru/pt-br/design-patterns/state
- https://www.baeldung.com/java-state-design-pattern









