observer + strategy pattern