We identify the collaborations in the system by carefully reading the requirements document sections that specify what the ATM should do to authenticate a user and to perform each transaction type. For each action or step described, we decide which objects in our system must interact to achieve the desired result. We identify one object as the sending object (i.e., the object that sends the message) and another as the receiving object (i.e., the object that offers that operation to clients of the class). We then select one of the receiving object’s operations (identified in Section 22.7) that must be invoked by the sending object to produce the proper behavior. For example, the ATM displays a welcome message when idle. We know that an object of class Screen
displays a message to the user via its displayMessage
operation. Thus, we decide that the system can display a welcome message by employing a collaboration between the ATM
and the Screen
in which the ATM
sends a displayMessage
message to the Screen
by invoking the displayMessage
operation of class Screen
. [Note: To avoid repeating the phrase “an object of class...,” we refer to each object simply by using its class name preceded by an article (“a,” “an” or “the”)—for example, “the ATM
” refers to an object of class ATM
.]
Figure 22.22 lists the collaborations that can be derived from the requirements document. For each sending object, we list the collaborations in the order in which they are discussed in the requirements document. We list each collaboration involving a unique sender, message and recipient only once, even though the collaboration may occur several times during an ATM session. For example, the first row in Fig. 22.22 indicates that the ATM
collaborates with the Screen
whenever the ATM
needs to display a message to the user.
Fig. 22.22. Collaborations in the ATM system.
Let’s consider the collaborations in Fig. 22.22. Before allowing a user to perform any transactions, the ATM must prompt the user to enter an account number, then to enter a PIN. It accomplishes each of these tasks by sending a displayMessage
message to the Screen
. Both of these actions refer to the same collaboration between the ATM
and the Screen
, which is already listed in Fig. 22.22. The ATM
obtains input in response to a prompt by sending a getInput
message to the Keypad
. Next, the ATM must determine whether the user-specified account number and PIN match those of an account in the database. It does so by sending an authenticateUser
message to the BankDatabase
. Recall that the BankDatabase
cannot authenticate a user directly—only the user’s Account
(i.e., the Account
that contains the account number specified by the user) can access the user’s PIN to authenticate the user. Figure 22.22 therefore lists a collaboration in which the BankDatabase
sends a validatePIN
message to an Account
.
After the user is authenticated, the ATM
displays the main menu by sending a series of displayMessage
messages to the Screen
and obtains input containing a menu selection by sending a getInput
message to the Keypad
. We’ve already accounted for these collaborations. After the user chooses a type of transaction to perform, the ATM
executes the transaction by sending an execute
message to an object of the appropriate transaction class (i.e., a BalanceInquiry
, a Withdrawal
or a Deposit
). For example, if the user chooses to perform a balance inquiry, the ATM
sends an execute
message to a BalanceInquiry
.
Further examination of the requirements document reveals the collaborations involved in executing each transaction type. A BalanceInquiry
retrieves the amount of money available in the user’s account by sending a getAvailableBalance
message to the BankDatabase
, which responds by sending a getAvailableBalance
message to the user’s Account
. Similarly, the BalanceInquiry
retrieves the amount of money on deposit by sending a getTotalBalance
message to the BankDatabase
, which sends the same message to the user’s Account
. To display both measures of the user’s balance at the same time, the BalanceInquiry
sends a displayMessage
message to the Screen
.
A Withdrawal
sends the Screen
several displayMessage
messages to display a menu of standard withdrawal amounts (i.e., $20, $40, $60, $100, $200). The Withdrawal
sends the Keypad
a getInput
message to obtain the user’s menu selection, then determines whether the requested withdrawal amount is less than or equal to the user’s account balance. The Withdrawal
can obtain the amount of money available in the account by sending the BankDatabase
a getAvailableBalance
message. The Withdrawal
then tests whether the cash dispenser contains enough cash by sending the CashDispenser
an isSufficientCashAvailable
message. A Withdrawal
sends the BankDatabase
a debit
message to decrease the user’s account balance. The BankDatabase
sends the same message to the appropriate Account
. Recall that debiting funds from an Account
decreases both the totalBalance
and the availableBalance
. To dispense the requested amount of cash, the Withdrawal
sends the CashDispenser
a dispenseCash
message. Finally, the Withdrawal
sends a displayMessage
message to the Screen
, instructing the user to take the cash.
A Deposit
responds to an execute
message first by sending a displayMessage
message to the Screen
to prompt the user for a deposit amount. The Deposit
sends a getInput
message to the Keypad
to obtain the user’s input. The Deposit
then sends a displayMessage
message to the Screen
to tell the user to insert a deposit envelope. To determine whether the deposit slot received an incoming deposit envelope, the Deposit
sends an isEnvelopeReceived
message to the DepositSlot
. The Deposit
updates the user’s account by sending a credit
message to the BankDatabase
, which subsequently sends a credit
message to the user’s Account
. Recall that crediting funds to an Account
increases the totalBalance
but not the availableBalance
.
3.133.152.26