add Observer Design Pattern