add Observer Pattern