add State Design Pattern