import abc

class PhoneAlert: # Context
  def __init__(self, state):
    self._state = state

  def alert(self):
    self._state.alert()
  
  def changestate(self, state):
    self._state = state

class AlertState(metaclass=abc.ABCMeta): # State
  @abc.abstractmethod
  def alert(self):
    pass
  
class Ringer(AlertState): # Concrete State A
  def alert(self):
    print('Ringing... Ringing... Ringing...')

class Vibrate(AlertState): # Concrete State B
  def alert(self):
    print('Vibrating... Vibrating... Vibrating')

class Silent(AlertState): # Concrete State C
  def alert(self):
    print('Silence... Silence... Silence')

def main():
  ring = Ringer()
  vib = Vibrate()
  sil = Silent()
  pa = PhoneAlert(ring)
  pa.alert()
  pa.changestate(vib)
  pa.alert()
  pa.changestate(sil)
  pa.alert()
  pa.changestate(vib)
  pa.alert()
  pa.changestate(ring)
  pa.alert()

if __name__ == "__main__":
  main()