complete strategy pattern, observer pattern