2. 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
8. 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
9. 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
10. Bài toán 2
• Nhân
vật
trong
game
có
hành
động
– Nhảy
khi
ấn
phím
B
11. 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);
}
}
12. 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);
}
}
– Vấn
đề????
13. Sửa bug1
void
Heroine::handleInput(Input
input){
if
(input
==
PRESS_B){
if
(!isJumping_){
isJumping_
=
true;
//
Jump...
}
• -‐>
OK
• Muốn
thêm
động
tác
ngồi???
14. Thêm
trạng
thái
• Thêm
if
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);
}
}
• Any
problem??
15. Thêm
trạng
thái
• Thêm
if
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);
}
}
• Any
problem??
– Ngồi
-‐>
ấn
nhảy,
thả
phím
down
-‐>
đứng
dậy
trên
không
16. 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);
}
}
}
27. 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
28. 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….