Add state pattern
Add strategy pattern