Download - Present delegate-state
![Page 1: Present delegate-state](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/1.jpg)
Delegate pa)ern State pa)ern
Giang Minh
![Page 2: Present delegate-state](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/2.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/3.jpg)
Bài toán
• Slidemenu
![Page 4: Present delegate-state](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/4.jpg)
Bài toán
• Slidemenu
![Page 5: Present delegate-state](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/5.jpg)
Bài toán
• Slidemenu
![Page 6: Present delegate-state](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/7.jpg)
Delegate pattern
•
![Page 8: Present delegate-state](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/17.jpg)
Thêm chức năng
• Tấn công khi đang nhảy và ấn DOWN
![Page 18: Present delegate-state](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/20.jpg)
Finite State machine
• a
![Page 21: Present delegate-state](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/26.jpg)
Các state khác
• Standing, Jumping, DivingState
![Page 27: Present delegate-state](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/27.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/28.jpg)
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](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/29.jpg)
THẢO LUẬN
![Page 30: Present delegate-state](https://reader033.vdocuments.site/reader033/viewer/2022052908/559487f61a28ab177d8b4593/html5/thumbnails/30.jpg)
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