题海让大学四年没有难题
白天模式登陆

题目详情

填空题 某软件公司要为一银行开发一套信用卡业务系统,银行账户(Account)是该系统的核心类之一,通过分析,该 软件公司开发人员发现在系统中账户存在3种状态,且在不同状态下账户存在不同的行为,具体说明如下: (1) 如果账户中余额大于等于0,则账户的状态为正常状态(Normal State),此时用户既可以向该账户存款也可以从该账户取款; (2) 如果账户中余额小于0,并且大于-2000,则账户的状态为透支状态(Overdraft State),此时用户既可以向该账户存款也可以从该账户取款,但需要按天计算利息; (3) 如果账户中余额等于-2000,那么账户的状态为受限状态(Restricted State),此时用户只能向该账户存款,不能再从中取款,同时也将按天计算利息; (4) 根据余额的不同,以上3种状态可发生相互转换. 现使用状态模式设计并实现银行账户状态的转换.银行账户状态图如图1所示,类图如图2所示. 图1 银行账户状态图 图2 类图 【Java代码】 //银行账户:环境类 public class Account { private (1) state; //维持一个对抽象状态对象的引用 private String owner; //开户名 private double balance = 0; //账户余额 public Account(String owner,double init) { this.owner = owner; this.balance = balance; this.state = new NormalState(this); //设置初始状态 System.out.println(this.owner + "开户,初始金额为" + init); System.out.println("---------------------------------------------"); } public double getBalance() { return this.balance; } public void setBalance(double balance) { this.balance = balance; } public void setState(AccountState state) { this.state = state; } //存款 public void deposit(double amount) { System.out.println(this.owner + "存款" + amount); state.deposit(amount); //调用状态对象的deposit()方法 System.out.println("现在余额为"+ this.balance); System.out.println("现在帐户状态为"+ this.state.getClass().getName()); System.out.println("---------------------------------------------"); } //取款 public void withdraw(double amount) { System.out.println(this.owner + "取款" + amount); state.withdraw(amount); //调用状态对象的withdraw()方法 System.out.println("现在余额为"+ this.balance); System.out.println("现在帐户状态为"+ this. state.getClass().getName()); System.out.println("---------------------------------------------"); } //计息 public void computeInterest() { state.computeInterest(); //调用状态对象的computeInterest()方法 } } //抽象状态类 public abstract class AccountState { protected (2) acc; public abstract void deposit(double amount); public abstract void withdraw(double amount); public abstract void computeInterest(); public abstract void stateCheck(); } //正常状态:具体状态类 public class NormalState extends AccountState { public NormalState(Account acc) { (3) ; } public NormalState(AccountState state) { this.acc = state.acc; } public void deposit(double amount) { acc.setBalance(acc.getBalance() + amount); stateCheck(); } public void withdraw(double amount) { acc.setBalance(acc.getBalance() - amount); (4) ; } public void computeInterest() { System.out.println("正常状态,无须支付利息!"); } //状态转换 public void stateCheck() { if (acc.getBalance() > -2000 && acc.getBalance() <= 0) { (5) ; } else if (acc.getBalance() == -2000) { acc.setState(new RestrictedState(this)); } else if (acc.getBalance() < -2000) { System.out.println("操作受限!"); } } } //透支状态:具体状态类 public class OverdraftState extends AccountState { public OverdraftState(AccountState state) { this.acc = state.acc; } public void deposit(double amount) { acc.setBalance(acc.getBalance() + amount); stateCheck(); } public void withdraw(double amount) { acc.setBalance(acc.getBalance() - amount); stateCheck(); } public void computeInterest() { System.out.println("计算利息!"); } //状态转换 public void stateCheck() { if (acc.getBalance() > 0) { acc.setState(new NormalStateState(this)) ; } else if (acc.getBalance() == -2000) { (6) ; } else if (acc.getBalance() < -2000) { System.out.println("操作受限!"); } } } //受限状态:具体状态类 public class RestrictedState extends AccountState { public RestrictedState(AccountState state) { (7) ; } public void deposit(double amount) { acc.setBalance(acc.getBalance() + amount); stateCheck(); } public void withdraw(double amount) { System.out.println("帐号受限,取款失败"); } public void computeInterest() { System.out.println("计算利息!"); } //状态转换 public void stateCheck() { if(acc.getBalance() > 0) { (8) ; } else if(acc.getBalance() > -2000) { acc.setState(new OverdraftState(this)) ; } } } //客户类 public class Client { public static void main(String args[]) { Account acc = new Account("段誉",0.0); acc.deposit(1000); acc.withdraw(2000); acc.deposit(3000); acc.withdraw(4000); acc.withdraw(1000); acc.computeInterest(); } }

软件体系结构与设计模式课程封面

学科:软件体系结构与设计模式

时间:2024-06-05 01:38:20

Copyright © 2022 津ICP备2021001502号