Me gustó el ejemplo. Le agregaría el estado concreto "EnSonido". Sí me gustaría indicar que el método setState() hace parecer a esta implementación del State más a un Strategy que a un State en sí. Normalmente, las transiciones entre estados, también pueden ser delegadas desde el contexto a su estado. Además creo que no es necesario que el contexto se envíe a sí mismo por parámetro en el método alert si ninguno lo utiliza (esto no debería ser exigido por la interfaz MobileAlertState).
La diferencia entre el State y el Strategy pattern es tenue. El propósito de uso es lo que determina que patrón utilizar. State se utiliza cuando se quieren tener implementaciones alternativas de un comportamiento, que dependen de alguna característica (un estado), Strategy es más utilizado para tener implementaciones distintas de un mismo comportamiento. Generalmente, la característica principal del State pattern es que, como mencionas, que el estado se define desde el contexto y además que puede ser delegado desde el estado mismo. El envío del contexto en le método alert es para cumplir precisamente este propósito, que desde un estado específico sea posible modificar el estado y delegar a nuevas implementaciones.