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;
// ...
}
}