Next:
Command Design Pattern
, Previous:
Composite Command
, Up:
Index
Undo
커맨드 클래스에 계좌에서 일어난 작업들에 대한 모든 정보를 담고 있다.
따라서 어떤 작업에 의한 변경 내용을 되돌려서 원본 상태를 리턴할 수 있다.
Undo 작업
1) 커맨드 인터페이스에 추가 기능으로 구현
2) Undo를 위한 추가적인 커맨드 구현
// Undo
기
능
이
추
가
된
Command
struct
Command
{
virtual
void
call
(
)
=
0
;
virtual
void
undo
(
)
=
0
;
}
;
void
undo
(
)
override
{
switch
(
action
)
{
case
withdraw
:
account
.
deposit
(
amount
)
;
break
;
case
deposit
:
account
.
withdraw
(
amount
)
;
break
;
}
}
//
입
금
-
출
금
은
대
칭
적
인
작
업
으
로
undo
작
업
은
쉽
게
구
현
가
능
하지만, 위에서 잔고보다 큰 금액을 출금할려고 하는 경우에 실패한 작업에 대해
undo 작업에서 확인을 수행하지 않았다.
출금 작업의 성공 여부를 리턴하도록 withdraw를 수정
bool
withdraw
(
int
amount
)
{
if
(
balance
-
amount
>=
overdraft_limit
)
{
balance
-=
amount
;
cout
<<
"
withdrew
"
<<
amount
<<
"
, balance now
"
<<
balance
<<
'\n'
;
return
true
;
}
return
false
;
}
struct
BankAccountCommand
:
Command
{
// ...
bool
withdrawal_succeeded
;
// BankAccountCommand(BankAccount& account, const Action action, const int amount): // ..., withdrawal_succeeded{false} {}
void
call
(
)
override
{
switch
(
action
)
{
// ...
case
withdraw
:
withdraw_succeeded
=
account
.
withdraw
(
amount
)
;
break
;
}
}
}
;
//
추
가
적
인
확
인
을
수
행
하
는
undo
void
undo
(
)
override
{
switch
(
action
)
{
case
withdraw
:
if
(
withdrawal_succeeded
)
account
.
deposit
(
amount
)
;
break
;
// ...
}
}