Challenge: Solution Review
This lesson will explain the solution to the problem from the previous coding challenge.
We'll cover the following...
Solution #
Press + to interact
class Command {execute(args) {};}//Withdraw commandclass WithDrawAmount extends Command {constructor(bankaccount) {super();this.bankaccount = bankaccount;}execute(args) {this.bankaccount.withdrawMoney(args);}}//CheckAmount commandclass CheckAmount extends Command {constructor(bankaccount) {super();this.bankaccount = bankaccount}execute() {this.bankaccount.checkAmount()}}//DepositAmount commandclass DepositAmount extends Command {constructor(bankaccount) {super();this.bankaccount = bankaccount}execute(args) {this.bankaccount.depositAmount(args)}}//Invokerclass AccountManager {request(command,args) {command.execute(args);}}//Reciever:class BankAccount {constructor(amount){this.amount = amount}checkAmount() {console.log(this.amount)}withdrawMoney(withdrawamount) {if(withdrawamount > this.amount){console.log("Not enough money")}else{this.amount -= withdrawamount}}depositAmount(money){this.amount += money}}const manager = new AccountManager();const account = new BankAccount(100)const check = new CheckAmount(account);manager.request(check)const withdraw = new WithDrawAmount(account);const deposit = new DepositAmount(account);manager.request(withdraw,10)manager.request(check)manager.request(deposit,50)manager.request(check)
Explanation #
Let’s start by looking at the original code first:
Press + to interact
class BankAccount {constructor(amount){this.amount = amount}checkAmount() {console.log(this.amount)}withdrawMoney(withdrawamount) {if(withdrawamount > this.amount){console.log("Not enough money")}else{this.amount -= withdrawamount}}depositAmount(money){this.amount += money}}var account = new BankAccount(100)account.checkAmount()account.withdrawMoney(10)account.checkAmount()account.depositAmount(50)account.checkAmount()
In the example, there is a BankAccount
class which contains the following functions:
-
checkAmount
: returns theamount
in the account -
withdrawMoney
: withdraws an amount -
depositAmount
: deposits an amount
An account object will be able to call on these functions directly. With the command pattern, we will change that. This means the object executing the function will be separated from the one requesting. As mentioned in the question, the command ...