add design pattern --observer