add Observer design pattern