首页计算机计算机软件面向对象软件工程 08 第八讲 Developing ATM Example with UML.pptx

08 第八讲 Developing ATM Example with UML.pptx

页数:75页文件大小:718.4 KB来源: 面向对象软件工程ppt课件

本课件以模拟自动柜员机系统为完整案例,演示用UML开发一个软件系统的全过程:先给出ATM的硬件组成与取款存款转账查询四类需求,再以用例图、系统启动与关闭、会话、交易四类顺序图和四类交易的合作图建立交互模型,随后用CRC卡逐一说明边界类、控制类与实体类的职责与协作者,给出完整类图、三个控制对象的状态图与包图,最后落到各类的详细设计与部分Java代码实现。

第八章封面页,标示本章主题为使用UML开发ATM实例
ATM需求第一部分页,列出读卡器客户控制台存信封口与出钞口等硬件组成
ATM需求第二部分页,列出取款存款转账与查询余额四类对客户的服务
查看本课件的文字版(共 75 页,供检索与复制)

第1页:第八章基于UML的ATM实例开发封面

第八章 Developing ATM Example with UML(用 UML 开发 ATM 实例):本章以模拟自动柜员机(ATM)系统为完整案例,演示从需求、用例、交互模型、分析类、类图、状态图到详细设计与代码实现的全过程。

第2页:ATM需求:硬件组成

ATM Requirements (1)(ATM 需求一):待设计的软件将控制一台模拟的自动柜员机(ATM),该机具有:

  • a magnetic stripe reader for reading an ATM card(读取 ATM 卡的磁条阅读器)
  • a customer console (keyboard and display) for interaction with the customer(用于与客户交互的客户控制台,含键盘与显示屏)
  • a slot for depositing envelopes(投放信封的存入口)
  • a dispenser for cash (in multiples of $20)(出钞器,按 20 美元的倍数出钞)
  • a printer for printing customer receipts(打印客户凭条的打印机)
  • a key-operated switch to allow an operator to start or stop the machine(供操作员启动或停机用的钥匙开关)
  • ATM 通过适当的通信链路与银行计算机通信

第3页:ATM需求:对客户的服务

ATM Requirements (2)(ATM 需求二):ATM 必须能向客户提供以下服务:

  • 客户可从与该卡关联的任一合适账户中提取现金,金额为 20.00 美元的倍数
  • 客户可向与该卡关联的任一账户存款,用信封装入现金和/或支票
  • 客户可在与该卡关联的任意两个账户之间转账
  • 客户可查询与该卡关联的任一账户余额

第4页:ATM需求:交易与日志要求

ATM Requirements (3)(ATM 需求三):

  • 客户必须能够中止一笔交易
  • ATM 将每笔交易传送给银行,并取得银行是否允许该交易的验证
  • ATM 为每笔成功交易向客户提供打印凭条
  • ATM 具有钥匙开关,允许操作员启动和停止对客户的服务
  • ATM 还维护一份内部交易日志

第5页:ATM系统用例图

Use Case(用例):本页以用例图给出 ATM 系统的执行者与用例,展示客户与系统之间的功能边界。客户可执行取款、存款、转账与查询四类交易,操作员负责系统的启动与停机。

第6页:系统启动顺序图

System Startup Sequence Diagram(系统启动顺序图):本页以顺序图展示 ATM 开机启动过程,包括自检、向操作员索取初始现金、与银行建立连接等消息序列。

第7页:系统关闭顺序图

System Shutdown Sequence Diagram(系统关闭顺序图):本页以顺序图展示 ATM 关机过程,包括终止与银行的连接、进入停机状态等消息序列。

第8页:会话顺序图

Session Sequence Diagram(会话顺序图):本页以顺序图展示一次完整会话:插卡、读卡、输入 PIN、校验、选择交易类型、执行交易、退卡等消息序列。

第9页:交易顺序图

Transaction Sequence Diagram(交易顺序图):本页以顺序图展示一笔交易的执行过程:向客户获取交易细节、组装消息发往银行、等待银行响应、完成交易并打印凭条。

第10页:取款交易合作图

Withdrawal Transaction Collaboration(取款交易合作图):本页以合作图展示取款交易中客户控制台、取款对象、出钞器、消息与凭条等对象之间的链接与消息传递。

第11页:存款交易合作图

Deposit Transaction Collaboration(存款交易合作图):本页以合作图展示存款交易中客户控制台、存款对象、信封接收器、消息与凭条等对象之间的链接与消息传递。

第12页:转账交易合作图

Transfer Transaction Collaboration(转账交易合作图):本页以合作图展示转账交易中客户控制台、转账对象、消息与凭条等对象之间的链接与消息传递。

第13页:查询交易合作图

Inquiry Transaction Collaboration(查询交易合作图):本页以合作图展示查询交易中客户控制台、查询对象、消息与凭条等对象之间的链接与消息传递。

第14页:无效PIN扩展合作图

Invalid PIN Extension Collaboration(无效 PIN 扩展合作图):本页以合作图展示 PIN 校验失败时的扩展处理:提示客户重新输入 PIN,超过限定次数后吞卡的交互过程。

第15页:分析类总览

Analysis Classes(分析类):本页以图示方式列出 ATM 系统识别出的全部分析类,并按边界类、控制类与实体类三类组织,包括 ATM、CardReader、CashDispenser、CustomerConsole、EnvelopeAcceptor、Log、NetworkToBank、OperatorPanel、ReceiptPrinter、Session、Transaction 及其子类 Withdrawal、Deposit、Transfer、Inquiry,以及 Balances、Card、Message、Receipt、Status 等。

第16页:ATM类的职责与协作者

CRC 卡 —— Class ATM(Boundary/entity objects):

  • Responsibilities(职责):Start up when switch is turned on(开关闭合时启动);Shut down when switch is turned off(开关断开时停机);Start a new session when card is inserted by customer(客户插卡时开始新会话)
  • Collaborators(协作者):OperatorPanel、CashDispenser、NetworkToBank、CustomerConsole、Session

第17页:CardReader类的职责与协作者

CRC 卡 —— Class CardReader(Boundary/entity objects):

  • Responsibilities:Tell ATM when card is inserted(告知 ATM 何时插卡);Read information from card(读取卡上信息);Eject card(退卡);Retain card(吞卡)
  • Collaborators:ATM、Card

第18页:CashDispenser类的职责与协作者

CRC 卡 —— Class CashDispenser(Boundary/entity objects):

  • Responsibilities:Keep track of cash on hand, starting with initial amount(从初始金额开始记录机内现金);Report whether enough cash is available(报告现金是否充足);Dispense cash(出钞)
  • Collaborators:Log

第19页:CustomerConsole类的职责与协作者

CRC 卡 —— Class CustomerConsole(Boundary/entity objects):

  • Responsibilities:Display a message(显示消息);Display a prompt, accept a PIN from keyboard(提示并从键盘接受 PIN);Display a prompt and menu, accept a choice from keyboard(提示并显示菜单、接受选择);Display a prompt, accept a dollar amount from keyboard(提示并接受金额输入);Respond to cancel key being pressed by customer(响应客户按下取消键)

第20页:EnvelopeAcceptor类的职责与协作者

CRC 卡 —— Class EnvelopeAcceptor(Boundary/entity objects):

  • Responsibilities:Accept envelope from customer; report if timed out or cancelled(接收客户投入的信封,超时或取消时报告)
  • Collaborators:Log

第21页:Log类的职责与协作者

CRC 卡 —— Class Log(Boundary/entity objects):

  • Responsibilities:Log messages sent to bank(记录发往银行的消息);Log responses from bank(记录银行响应);Log dispensing of cash(记录出钞);Log receiving an envelope(记录收到信封)

第22页:NetworkToBank类的职责与协作者

CRC 卡 —— Class NetworkToBank(Boundary/entity objects):

  • Responsibilities:Initiate connection to bank at startup(启动时建立与银行的连接);Send message to bank and wait for response(向银行发送消息并等待响应);Terminate connection to bank at shutdown(停机时终止连接)
  • Collaborators:Message、Log

第23页:OperatorPanel类的职责与协作者

CRC 卡 —— Class OperatorPanel(Boundary/entity objects):

  • Responsibilities:Inform ATM of changes to state of switch(将开关状态变化通知 ATM);Allow operator to specify amount of initial cash(允许操作员指定初始现金金额)
  • Collaborators:ATM

第24页:ReceiptPrinter类的职责与协作者

CRC 卡 —— Class ReceiptPrinter(Boundary/entity objects):

  • Responsibilities:Print receipt(打印凭条)
  • Collaborators:Receipt

第25页:Session类的职责与协作者

CRC 卡 —— Class Session(Control objects):

  • Responsibilities:Perform session use case(执行会话用例);Update PIN value if customer has to re-enter it(客户重新输入时更新 PIN 值)
  • Collaborators:ATM、CardReader、Card、CustomerConsole、Transaction

第26页:Transaction抽象类的职责与协作者

CRC 卡 —— Abstract Class Transaction(Control objects):

  • Responsibilities:Allow customer to choose a type of transaction(让客户选择交易类型);Perform Transaction Use Case(执行交易用例);Perform invalid PIN extension(执行无效 PIN 扩展)
  • Collaborators:ATM、CustomerConsole、Withdrawal、Transfer、Deposit、Inquiry、Message、NetworkToBank、ReceiptPrinter、Session、CardReader

第27页:Withdrawal类的职责与协作者

CRC 卡 —— Class Withdrawal(Control objects):

  • Responsibilities:Perform operations peculiar to withdrawal transaction use case(执行取款交易用例特有的操作)
  • Collaborators:CustomerConsole、CashDispenser、Message、Receipt

第28页:Deposit类的职责与协作者

CRC 卡 —— Class Deposit(Control objects):

  • Responsibilities:Perform operations peculiar to deposit transaction use case(执行存款交易用例特有的操作)
  • Collaborators:CustomerConsole、Message、EnvelopeAcceptor、Receipt

第29页:Transfer类的职责与协作者

CRC 卡 —— Class Transfer(Control objects):

  • Responsibilities:Perform operations peculiar to transfer transaction use case(执行转账交易用例特有的操作)
  • Collaborators:CustomerConsole、Message、Receipt

第30页:Inquiry类的职责与协作者

CRC 卡 —— Class Inquiry(Control objects):

  • Responsibilities:Perform operations peculiar to inquiry transaction use case(执行查询交易用例特有的操作)
  • Collaborators:CustomerConsole、Message、Receipt

第31页:Balances类的职责

CRC 卡 —— Class Balances(entity objects):职责为 Represent account balance information returned by bank(表示银行返回的账户余额信息),含总余额与可用余额两部分。

第32页:Card类的职责

CRC 卡 —— Class Card(entity objects):职责为 Represent information encoded on customer's ATM card(表示客户 ATM 卡上编码的信息),主要是卡号。

第33页:Message类的职责

CRC 卡 —— Class Message(entity objects):职责为 Represent information to be sent over network to bank(表示通过网络发往银行的信息),包括消息码、卡号、PIN、流水号、转入转出账户与金额。

第34页:Receipt类的职责

CRC 卡 —— Class Receipt(entity objects):职责为 Represent information to be printed on a receipt(表示打印在凭条上的信息),含抬头部分、明细部分与余额部分。

第35页:Status类的职责

CRC 卡 —— Class Status(entity objects):职责为 Represent transaction status information returned by bank(表示银行返回的事务状态信息),可判断是否成功、是否为无效 PIN。

第36页:ATM系统类图

Class Diagram(类图):本页给出 ATM 系统的完整类图,展示 ATM、Session、Transaction 及其四个子类 Withdrawal、Deposit、Transfer、Inquiry,以及各边界类 CardReader、CashDispenser、CustomerConsole、EnvelopeAcceptor、NetworkToBank、OperatorPanel、ReceiptPrinter、Log 与实体类 Card、Message、Balances、Status、Receipt 之间的关联、聚集与继承关系。

第37页:ATM类的状态图

Statecharts for Control Objects: ATM(ATM 类的状态图):本页给出 ATM 控制对象的状态图,包含关闭、空闲、服务于客户等状态,以及由开关状态与插卡事件触发的状态转移。

第38页:Session类的状态图

Statecharts for control objects: Session(会话类的状态图):本页给出会话对象的状态图,包含读卡、读 PIN、选择交易、执行交易、退卡与终止等状态及其转移条件。

第39页:Transaction类的状态图

Statecharts for control objects: Transaction(交易类的状态图):本页给出交易对象的状态图,包含获取交易细节、发往银行、无效 PIN、完成交易、打印凭条、询问是否再做一笔等状态及其转移。

第40页:ATM系统包图

Package Diagram(包图):本页给出 ATM 系统的包结构,按物理设备层、ATM 控制层、事务层与银行业务层等划分包,并展示包之间的依赖关系。

第41页:ATM类的属性

Detail Design of Classes —— ATM 类的属性:

  • - id: int;- place: String;- bankName: String;- bankAddress: InetAddress
  • - cardReader: CardReader;- cashDispenser: CashDispenser;- customerConsole: CustomerConsole;- envelopeAcceptor: EnvelopeAcceptor
  • - log: Log;- networkToBank: NetworkToBank;- operatorPanel: OperatorPanel;- receiptPrinter: ReceiptPrinter
  • - state: int;- switchOn: boolean;- cardInserted: boolean
  • - OFF_STATE、IDLE_STATE、SERVING_CUSTOMER_STATE: final int(状态常量)

第42页:ATM类的操作

Detail Design of Classes —— ATM 类的操作:

  • + ATM(id: int, place: String, bankName: String, bankAddress: InetAddress)
  • + run();+ switchOn();+ switchOff();+ cardInserted()
  • + getID(): int;+ getPlace(): String;+ getBankName(): String
  • + getCardReader(): CardReader;+ getCashDispenser(): CashDispenser;+ getCustomerConsole(): CustomerConsole
  • + getEnvelopeAcceptor(): EnvelopeAcceptor;+ getLog(): Log;+ getNetworkToBank(): NetworkToBank;+ getOperatorPanel(): OperatorPanel;+ getReceiptPrinter(): ReceiptPrinter
  • - performStartup();- performShutdown()

第43页:CardReader类的详细设计

Detail Design of Classes —— CardReader:属性 - atm: ATM;操作 + CardReader(atm: ATM)、+ readCard(): Card、+ ejectCard()、+ retainCard()。

第44页:CashDispenser类的详细设计

Detail Design of Classes —— CashDispenser:属性 - log: Log、- cashOnHand: Money;操作 + CashDispenser(log: Log)、+ setInitialCash(initialCash: Money)、+ checkCashOnHand(amount: Money): boolean、+ dispenseCash(amount: Money)。

第45页:CustomerConsole类的详细设计

Detail Design of Classes —— CustomerConsole:操作 + CustomerConsole()、+ display(message: String)、+ readPIN(prompt: String): int throws Cancelled、+ readMenuChoice(prompt: String, menu: String[]): int throws Cancelled、+ readAmount(prompt: String): Money throws Cancelled。

第46页:EnvelopeAcceptor类的详细设计

Detail Design of Classes —— EnvelopeAcceptor:属性 - log: Log;操作 + EnvelopeAcceptor(log: Log)、+ acceptEnvelope() throws Cancelled。

第47页:Log类的详细设计

Detail Design of Classes —— Log:操作 + Log()、+ logSend(message: Message)、+ logResponse(status: Status)、+ logCashDispensed(amount: Money)、+ logEnvelopeAccepted()。

第48页:NetworkToBank类的详细设计

Detail Design of Classes —— NetworkToBank:属性 - log: Log、- bankAddress: InetAddress;操作 + NetworkToBank(log: Log, bankAddress: InetAddress)、+ openConnection()、+ closeConnection()、+ sendMessage(message: Message, out balances: Balances): Status。

第49页:OperatorPanel类的详细设计

Detail Design of Classes —— OperatorPanel:属性 - atm: ATM;操作 + OperatorPanel(atm: ATM)、+ getInitialCash(): Money。

第50页:ReceiptPrinter类的详细设计

Detail Design of Classes —— ReceiptPrinter:操作 + ReceiptPrinter()、+ printReceipt(receipt: Receipt)。

第51页:Session类的详细设计

Detail Design of Classes —— Session:属性 - atm: ATM、- pin: int、- state: int,以及 READING_CARD_STATE、READING_PIN_STATE、CHOOSING_TRANSACTION_STATE、PERFORMING_TRANSACTION_STATE、EJECTING_CARD_STATE、FINAL_STATE 六个 final int 状态常量;操作 + Session(atm: ATM)、+ performSession()、+ setPIN(int pin)。

第52页:Transaction类的属性

Detail Design of Classes —— Transaction 类的属性:

  • # atm: ATM;# session: Session;# card: Card;# pin: String;# serialNumber: int;# message: Message;# balances: Balances
  • - TRANSACTION_TYPES_MENU: final String[];- nextSerialNumber: int;- state: int
  • 状态常量:GETTING_SPECIFICS_STATE、SENDING_TO_BANK_STATE、INVALID_PIN_STATE、COMPLETING_TRANSACTION_STATE、PRINTING_RECEIPT_STATE、ASKING_DO_ANOTHER_STATE: final int

第53页:Transaction类的操作

Detail Design of Classes —— Transaction 类的操作:

  • # Transaction(atm: ATM, session: Session, card: Card, pin: int)
  • + makeTransaction(atm: ATM, session: Session, card: Card, pin: int): Transaction throws Cancelled
  • + performTransaction(): boolean throws CardRetained
  • + performInvalidPinExtension(): Status throws Cancelled, CardRetained
  • + getSerialNumber(): int
  • # getSpecificsFromCustomer(): Message throws Cancelled;# completeTransaction(): Receipt throws Cancelled

第54页:Withdrawal类的详细设计

Detail Design of Classes —— Withdrawal:属性 - from: int、- amount: Money;操作 + Withdrawal(atm: ATM, session: Session, card: Card, pin: int)、# getSpecificsFromCustomer(): Message throws Cancelled、# completeTransaction(): Receipt。

第55页:Deposit类的详细设计

Detail Design of Classes —— Deposit:属性 - to: int、- amount: Money;操作 + Deposit(atm: ATM, session: Session, card: Card, pin: int)、# getSpecificsFromCustomer(): Message throws Cancelled、# completeTransaction(): Receipt throws Cancelled。

第56页:Transfer类的详细设计

Detail Design of Classes —— Transfer:属性 - from: int、- to: int、- amount: Money;操作 + Transfer(atm: ATM, session: Session, card: Card, pin: int)、# getSpecificsFromCustomer(): Message throws Cancelled、# completeTransaction(): Receipt。

第57页:Inquiry类的详细设计

Detail Design of Classes —— Inquiry:属性 - from: int;操作 + Inquiry(atm: ATM, session: Session, card: Card, pin: int)、# getSpecificsFromCustomer(): Message throws Cancelled、# completeTransaction(): Receipt。

第58页:AccountInformation类的详细设计

Detail Design of Classes —— AccountInformation:+ ACCOUNT_NAMES: final String[]、+ ACCOUNT_ABBREVIATIONS: final String[],分别给出菜单中显示的账户名称与凭条上打印的账户缩写。

第59页:Balances类的详细设计

Detail Design of Classes —— Balances:属性 - total: Money、- available: Money;操作 + Balances()、+ setBalances(total: Money, available: Money)、+ getTotal(): Money、+ getAvailable(): Money。

第60页:Card类的详细设计

Detail Design of Classes —— Card:属性 - number: int;操作 + Card(number: int)、+ getNumber(): int。

第61页:Message类的属性

Detail Design of Classes —— Message 类:消息码常量 + WITHDRAWAL、+ INITIATE_DEPOSIT、+ COMPLETE_DEPOSIT、+ TRANSFER、+ INQUIRY: final int;属性 - messageCode: int、- card: Card、- pin: String、- serialNumber: int、- fromAccount: int、- toAccount: int、- amount: int。

第62页:Message类的操作

Detail Design of Classes —— Message 类的操作:+ Message(messageCode: int, cardNumber: Card, pin: int, serialNumber: int, fromAccount: int, toAccount: int, amount: Money)、+ toString(): String、+ setPIN(pin: int)、+ getMessageCode(): int、+ getCard(): Card、+ getPIN(): String、+ getSerialNumber(): int、+ getFromAccount(): int、+ getToAccount(): int、+ getAmount(): Money。

第63页:Money类的详细设计

Detail Design of Classes —— Money:属性 - cents: long;操作 + Money(dollars: int)、+ Money(dollars: int, cents: int)、+ Money(toCopy: Money)、+ toString(): String、+ add(amountToAdd: Money)、+ subtract(amountToSubtract: Money)、+ lessEqual(compareTo: Money): boolean。

第64页:Receipt类的详细设计

Detail Design of Classes —— Receipt:属性 - headingPortion: String[]、# detailsPortion(): String[]、- balancesPortion: String[];操作 # Receipt(atm: ATM, card: Card, transaction: Transaction, balances: Balances)、+ getLines(): Enumeration。

第65页:Status类的详细设计

Detail Design of Classes —— Status:操作 + toString(): String、+ isSuccess(): boolean、+ isInvalidPIN(): boolean、+ getMessage(): String。

第66页:Card类的Java代码

Code(代码)—— 包 banking 中的 Card 类:

  • public class Card { public Card(int number) { this.number = number; }
  • public int getNumber() { return number; }
  • 注释 ,私有成员 private int number;

第67页:AccountInformation类的Java代码

Code —— 包 banking 中的 AccountInformation 类:该类的静态成员包含银行所提供账户的信息,实际与银行通信使用账户类型编号(例如 0 表示列出的第一类账户)。

  • public static final String[] ACCOUNT_NAMES = { "Checking", "Savings", "Money Market" };(菜单中显示给客户的账户名)
  • public static final String[] ACCOUNT_ABBREVIATIONS = { "CHKG", "SVGS", "MMKT" };(凭条上打印的账户名缩写)

第68页:Balances类的Java代码

Code —— 包 banking 中的 Balances 类:public class Balances { public Balances() {} public void setBalances(Money total, Money available) { this.total = total; this.available = available; } public Money getTotal() { return total; } public Money getAvailable() { return available; } private Money total; private Money available; }

第69页:CashDispenser类的Java代码

Code —— 包 atm.physical 中的 CashDispenser 类:构造方法中将 cashOnHand 初始化为 new Money(0);setInitialCash 设置初始现金;checkCashOnHand 用 amount.lessEqual(cashOnHand) 判断现金是否充足;dispenseCash 先扣减现金,再调用 Simulation.getInstance().dispenseCash(amount) 出钞,并调用 log.logCashDispensed(amount) 记录日志。

第70页:CardReader类的Java代码

Code —— 包 atm.physical 中的 CardReader 类:readCard() 返回 Simulation.getInstance().readCard();ejectCard() 调用 Simulation.getInstance().ejectCard();retainCard() 调用 Simulation.getInstance().retainCard();私有成员 private ATM atm; 由构造方法注入。

第71页:Inquiry类的Java代码

Code —— 包 atm.transaction 中的 Inquiry 类:public class Inquiry extends Transaction,构造方法调用 super(atm, session, card, pin)。

  • getSpecificsFromCustomer() 通过 atm.getCustomerConsole().readMenuChoice("Account to inquire from", AccountInformation.ACCOUNT_NAMES) 取得查询账户,返回 new Message(Message.INQUIRY, card, pin, serialNumber, from, -1, new Money(0))
  • completeTransaction() 返回 new Receipt(...),其 detailsPortion 第一行拼接 "INQUIRY FROM: " 与账户缩写,第二行为空

第72页:可执行系统演示

Executable(可执行系统):本页展示 ATM 仿真程序可执行版本的运行结果界面,用于验证前面分析与设计模型的正确性。

第73页:可执行系统演示(续1)

Executable(可执行系统):本页继续展示 ATM 仿真程序可执行版本的运行画面。

第74页:可执行系统演示(续2)

Executable(可执行系统):本页继续展示 ATM 仿真程序可执行版本的运行画面。

第75页:本章小结

Summary(本章小结):Analysis and Design Process with UML(使用 UML 的分析与设计过程):

  • 1. Identify actors and use cases(识别执行者与用例)
  • 2. Realize use cases with sequence and/or collaboration diagrams(用顺序图和/或合作图实现用例)
  • 3. Describe classes and their relationships in the logical view(在逻辑视图中描述类及其关系)
  • 4. Create state diagrams for objects(为对象创建状态图)
  • 5. Illustrate the organizations and dependencies among software components with component diagrams(用构件图说明软件构件的组织与依赖)
  • 6. Visualize configuration and distribution with deployment diagrams(用配置图可视化配置与分布)
顶部目录