add design pattern:observer