strategy pattern
observer pattern