30
Delegate pa)ern State pa)ern Giang Minh

Present delegate-state

Embed Size (px)

Citation preview

Page 1: Present delegate-state

Delegate  pa)ern  State  pa)ern

Giang  Minh

Page 2: Present delegate-state

Outline

•  Delegate  – Bài  toán,  vấn  đề  – Giới  thiệu  delegate  và  áp  dụng  – Các  trường  hợp  nên  sử  dụng  

•  State  – Bài  toán  thực  tế    – Vấn  đề  khi  giải  quyết  bằng  phương  pháp  thông  thường  

– Các  giải  quyết  với  state  

Page 3: Present delegate-state

Bài toán

•  Slidemenu

Page 4: Present delegate-state

Bài toán

•  Slidemenu

Page 5: Present delegate-state

Bài toán

•  Slidemenu

Page 6: Present delegate-state

Bài  toán

•  Vấn  đề  – Cùng  một  dạng  nhưng  được  lặp  lại  •  Có  một  vài  hành  vi  khác  nhau  

•  Thông  thường  – Dư  thừa  code  – Không  sử  dụng  lại  được  code

Page 7: Present delegate-state

Delegate pattern

•   

Page 8: Present delegate-state

Hoàn cảnh sử dụng

•  Giảm  thiểu  sự  móc  nối  các  func^on  giữa  các  class  

•  Có  những  thành  phần  cố  định  – Nhưng  hành  vi  thay  đổi  tuỳ  ngữ  cảnh

Page 9: Present delegate-state

Nhận xét

•  Điểm  mạnh  – Reuse  – Mềm  dẻo  

•  Điểm  yếu  – Tốn  công  – Khi  cần  phản  hồi  đến  nhiều  delegator

Page 10: Present delegate-state

Bài toán 2

•  Nhân  vật  trong  game  có  hành  động  – Nhảy  khi  ấn  phím  B

Page 11: Present delegate-state

Bài toán 2

•  Nhân  vật  trong  game  có  hành  động  – Nhảy  khi  ấn  phím  B

void  Heroine::handleInput(Input  input)  {      if  (input  ==  PRESS_B)      {          yVelocity_  =  JUMP_VELOCITY;          setGraphics(IMAGE_JUMP);      }  }  

Page 12: Present delegate-state

Bài toán 2

•  Nhân  vật  trong  game  có  hành  động  – Nhảy  khi  ấn  phím  B  

– Vấn  đề????

void  Heroine::handleInput(Input  input)  {      if  (input  ==  PRESS_B)      {          yVelocity_  =  JUMP_VELOCITY;          setGraphics(IMAGE_JUMP);      }  }  

Page 13: Present delegate-state

Sửa bug1

•  -­‐>  OK  •  Muốn  thêm  động  tác  ngồi???  

void  Heroine::handleInput(Input  input){      if  (input  ==  PRESS_B){          if  (!isJumping_){              isJumping_  =  true;              //  Jump...          }  

Page 14: Present delegate-state

Thêm  trạng  thái

•  Thêm  if  

•  Any  problem??

void  Heroine::handleInput(Input  input){      if  (input  ==  PRESS_B)  {          //  Jump  if  not  jumping...      }  else  if  (input  ==  PRESS_DOWN){          if  (!isJumping_)        {              setGraphics(IMAGE_DUCK);          }      }    else  if  (input  ==  RELEASE_DOWN)    {          setGraphics(IMAGE_STAND);      }  }

Page 15: Present delegate-state

Thêm  trạng  thái

•  Thêm  if  

   •  Any  problem??  – Ngồi  -­‐>  ấn  nhảy,  thả  phím  down  -­‐>  đứng  dậy  trên  không

void  Heroine::handleInput(Input  input){      if  (input  ==  PRESS_B)  {          //  Jump  if  not  jumping...      }  else  if  (input  ==  PRESS_DOWN){          if  (!isJumping_)        {              setGraphics(IMAGE_DUCK);          }      }    else  if  (input  ==  RELEASE_DOWN)    {          setGraphics(IMAGE_STAND);      }  }

Page 16: Present delegate-state

Sửa bug2

•  Thêm  checker   void  Heroine::handleInput(Input  input){      if  (input  ==  PRESS_B)    {          if  (!isJumping_  &&  !isDucking_)        {              //  Jump...          }      }    else  if  (input  ==  PRESS_DOWN)    {          if  (!isJumping_)        {              isDucking_  =  true;              setGraphics(IMAGE_DUCK);          }      }    else  if  (input  ==  RELEASE_DOWN)    {          if  (isDucking_){              isDucking_  =  false;              setGraphics(IMAGE_STAND);          }      }  }  

Page 17: Present delegate-state

Thêm chức năng

•  Tấn  công  khi  đang  nhảy  và  ấn  DOWN  

Page 18: Present delegate-state

Thêm chức năng

•  Tấn  công  khi  đang  nhảy  và  ấn  DOWN  •  Đặt  bom  khi  ngồi  lâu  •  …………………  

 

Page 19: Present delegate-state

Thêm chức năng

•  Tấn  công  khi  đang  nhảy  và  ấn  DOWN  •  Đặt  bom  khi  ngồi  lâu  •  …………………  

•  -­‐>  quá  nhiều  checker,  flag,  countdown  

Page 20: Present delegate-state

Finite State machine

•  a

Page 21: Present delegate-state

Finite state machine

•  Enum  +  if  enum  State  {      STATE_STANDING,      STATE_JUMPING,      STATE_DUCKING,      STATE_DIVING  };

void  Heroine::handleInput(Input  input)  {      switch  (state_)      {          case  STATE_STANDING:              if  (input  ==  PRESS_B)              {                  state_  =  STATE_JUMPING;                  yVelocity_  =  JUMP_VELOCITY;                  setGraphics(IMAGE_JUMP);              }              else  if  (input  ==  PRESS_DOWN)              {                  state_  =  STATE_DUCKING;                  setGraphics(IMAGE_DUCK);              }              break;  …………………………………

Page 22: Present delegate-state

Finite state machine

•  Enum  +  if  enum  State  {      STATE_STANDING,      STATE_JUMPING,      STATE_DUCKING,      STATE_DIVING  };

void  Heroine::handleInput(Input  input)  {      switch  (state_)      {          case  STATE_STANDING:              if  (input  ==  PRESS_B)              {                  state_  =  STATE_JUMPING;                  yVelocity_  =  JUMP_VELOCITY;                  setGraphics(IMAGE_JUMP);              }              else  if  (input  ==  PRESS_DOWN)              {                  state_  =  STATE_DUCKING;                  setGraphics(IMAGE_DUCK);              }              break;  …………………………………

Ø  Số  lượng  state  tăng  Ø Mỗi  state  có  dữ  liệu  riêng  

l  Countdown  l  Timing

Page 23: Present delegate-state

State  pa)ern

•  Mỗi  state  được  implement  riêng  •  State  <  -­‐-­‐  >  Behavior  •  StateInterface

class  HeroineState  {  public:      virtual  void  handleInput(Heroine&  heroine,  Input  input)  {}      virtual  void  update(Heroine&  heroine)  {}      virtual  void  enter(Heroine&  heroine){}  };

Page 24: Present delegate-state

class  DuckingState  :  public  HeroineState{  public:      DuckingState()    :  chargeTime_(0)    {}        void  handleInput(Heroine&  heroine,  Input  input)  {          if  (input  ==  RELEASE_DOWN)        {              //  Change  to  standing  state...              heroine.setGraphics(IMAGE_STAND);          }      }      void  update(Heroine&  heroine)  {          chargeTime_++;          if  (chargeTime_  >  MAX_CHARGE){              heroine.superBomb();          }      }  private:      int  chargeTime_;  };

Page 25: Present delegate-state

class  Heroine  {  public:      void  handleInput(Input  input)      {          state_-­‐>handleInput(*this,  input);      }        void  update()      {          state_-­‐>update(*this);      }          void  sw^chState(HeroineState*  new_state)      {          state_    =    new_state;          state_-­‐>enter  (*this);      }            //  Other  methods...  private:      HeroineState*  state_;  };

Page 26: Present delegate-state

Các  state  khác

•  Standing,  Jumping,  DivingState

Page 27: Present delegate-state

Hoàn cảnh sử dụng

•  Hành  vi  phụ  thuộc  vào  một  vài  trạng  thái  của  object  

•  Phân  chia  được  hoạt  động  của  object  ra  những  state  khác  biệt,  cụ  thể  

•  Object  phản  hồi  theo  những  chuỗi  input  hoặc  sự  kiện

Page 28: Present delegate-state

Nhận xét

•  Thêm  state  dễ  dàng  – Sơ  đồ  chuyển  trạng  thái  – Tách  rời  các  state  

•  Quản  lý  giữa  các  state  rõ  ràng  – Bỏ  flag,  checker….

Page 29: Present delegate-state

THẢO  LUẬN

Page 30: Present delegate-state

Thực hành

•  Nhân  vật  có  3  trạng  thái  – Đứng  – Chạy  chậm  – Chạy  nhanh  

•  KeyboardDelegate  •  StatePa)ern