Add observer and strategy pattern