observer design pattern
observer dp