系统需求:
BankSysterm3相对于BankSysterm2提出的新需求有:
1:存储上次变更余额的日期。
2:报告系统运行中发生的错误,例如当取款金额大于余额时提示余额不足
系统设计:
为了适应系统提出的新需求,在设计方面新增了一个Date类,以及在SavingsAccount中加一个error(){} 方法,来实现新的需求。
根据系统代码画出uml类图:
SavingsAccount |
-id :string - balance: double - rate :double - accumulation : double - total : static double -record( Date date , double amount , String desc): void -error(string msg): void - accumulate(Date date): void |
+SavingsAccount( Date date, String id, double rate) +getId():String +getBalance() :double + getRate() :double +getTotal() :static double +deposit( Date date, double amount, String desc):void +withdraw(Date date, double amount, String desc):void + settle( Date date):void + show() :void |
Date |
- year: int - month : int - day :int -totalDays :int |
+Date(int year, int month, int day) +getYear() :int +getMonth() :int + getDay() :int +getMaxDay() :int +isLeapYear() :int +show() :void + distance( Date date) :int |
package Account;
import date.*;
public class SavingsAccount {
private String id; //帐号
private double balance; //余额
private double rate; //存款的年利率
private Date lastDate; //上次变更余额的时期
private double accumulation; //余额按日累加之和
private static double total; //所有账户的总金额
//记录一笔帐,date为日期,amount为金额,desc为说明
private void record( Date date, double amount, String desc)
{
accumulation = accumulate(date);
lastDate = date;
amount = (amount * 100 + 0.5)/ 100; //保留小数点后两位
balance += amount;
total += amount;
date.show();
System.out.println("\t#" +id +"\t" + amount + "\t" + balance + "\t" + desc);
}
//报告错误信息
private void error(String msg)
{
System.out.println( "Error(#" + id +"): " + msg);
}
//获得到指定日期为止的存款金额按日累积值
private double accumulate(Date date) {
return accumulation + balance * date.distance(lastDate);
}
//构造函数
public SavingsAccount( Date date, String id, double rate){
this.id=id;
balance=0;
this.rate=rate;
this.lastDate=date;
accumulation=0;
date.show();
System.out.println("\t#" + id + " created" );
}
public String getId() { return id; }
public double getBalance() { return balance; }
public double getRate() { return rate; }
public static double getTotal(){return total;}
//存入现金
public void deposit(Date date, double amount, String desc){
record(date, amount, desc);
}
//取出现金
public void withdraw( Date date, double amount, String desc) {
if (amount > getBalance())
error("not enough money");
else
record(date, -amount, desc);
}
//结算利息,每年1月1日调用一次该函数
public void settle(Date date){
double interest = accumulate(date) * rate //计算年息
/ date.distance(new Date(date.getYear() - 1, 1, 1));
if (interest != 0)
record(date, interest, "interest");
accumulation = 0;
}
//显示账户信息
public void show() {
System.out.print( id + "\tBalance: " + balance);
}
}
package Account;
import date.*;
public class SavingsAccount {
private String id; //帐号
private double balance; //余额
private double rate; //存款的年利率
private Date lastDate; //上次变更余额的时期
private double accumulation; //余额按日累加之和
private static double total; //所有账户的总金额
//记录一笔帐,date为日期,amount为金额,desc为说明
private void record( Date date, double amount, String desc)
{
accumulation = accumulate(date);
lastDate = date;
amount = (amount * 100 + 0.5)/ 100; //保留小数点后两位
balance += amount;
total += amount;
date.show();
System.out.println("\t#" +id +"\t" + amount + "\t" + balance + "\t" + desc);
}
//报告错误信息
private void error(String msg)
{
System.out.println( "Error(#" + id +"): " + msg);
}
//获得到指定日期为止的存款金额按日累积值
private double accumulate(Date date) {
return accumulation + balance * date.distance(lastDate);
}
//构造函数
public SavingsAccount( Date date, String id, double rate){
this.id=id;
balance=0;
this.rate=rate;
this.lastDate=date;
accumulation=0;
date.show();
System.out.println("\t#" + id + " created" );
}
public String getId() { return id; }
public double getBalance() { return balance; }
public double getRate() { return rate; }
public static double getTotal(){return total;}
//存入现金
public void deposit(Date date, double amount, String desc){
record(date, amount, desc);
}
//取出现金
public void withdraw( Date date, double amount, String desc) {
if (amount > getBalance())
error("not enough money");
else
record(date, -amount, desc);
}
//结算利息,每年1月1日调用一次该函数
public void settle(Date date){
double interest = accumulate(date) * rate //计算年息
/ date.distance(new Date(date.getYear() - 1, 1, 1));
if (interest != 0)
record(date, interest, "interest");
accumulation = 0;
}
//显示账户信息
public void show() {
System.out.print( id + "\tBalance: " + balance);
}
}
package bank;
import date.*;
import Account.*;
public class BankSystem {
public static void main(String[] args) {
// TODO Auto-generated method stub
Date date=new Date(2008, 11, 1); //起始日期
//建立几个账户
SavingsAccount accounts[] = {
new SavingsAccount(date, "S3755217", 0.015),
new SavingsAccount(date, "02342342", 0.015)
};
final int n = 2; //账户总数
//11月份的几笔账目
accounts[0].deposit(new Date(2008, 11, 5), 5000, "salary");
accounts[1].deposit(new Date(2008, 11, 25), 10000, "sell stock 0323");
//12月份的几笔账目
accounts[0].deposit(new Date(2008, 12, 5), 5500, "salary");
accounts[1].withdraw(new Date(2008, 12, 20), 4000, "buy a laptop");
//结算所有账户并输出各个账户信息
System.out.println(" ");
for (int i = 0; i < n; i++) {
accounts[i].settle(new Date(2009, 1, 1));
accounts[i].show();
System.out.println(" ");
}
System.out.println( "Total: " + SavingsAccount.getTotal());
}
}