实验题目
将替换这样的数组代码:这些数组代码用于实现银行和客户间,以及客户与他们 的帐户间的关系的多样性。
实验目的
使用集合
提示
修改 Bank 类
修改 Bank 类,利用 ArrayList 实现多重的客户关系,不要忘记倒入必须的 java.uti类。
- 将 Customer 属性的声明修改为List 类型,不再使用 numberOfCustomers 属性。
- 修改 Bank 构造器,将 customers 属性的声明修改为List 类型,不再使用 numberOfcustomers 属性。
- 修改 addCustomer 方法,使用 add 方法 。
- 修改 getCustomer 方法,使用 get 方法。
- 修改 getNumofCustomer 方法,使用 size 方法
修改 Customer 类。
- 修改 Customer 类,使用 ArrayList 实现多重的账户关系。修改方法同上。
编译运行 TestBanking 程序这里,不必修改 CustomerReport 代码,因为并没有改变 Bank 和 Customer 类的接口。编译运行TestBanking 应看到下列输出结果:
CUSTOMERSREPORT================Customer: Simms, JaneSavingsAccount: currentbalanceis¥500.0CheckingAccount: currentbalanceis¥200.0Customer: Bryant, OwenCheckingAccount: currentbalanceis¥200.0Customer: Soley, TimSavingsAccount: currentbalanceis¥1500.0CheckingAccount: currentbalanceis¥200.0Customer: Soley, MariaCheckingAccount: currentbalanceis¥200.0SavingsAccount: currentbalanceis¥150.0
代码
【Account.java】类
packagebanking; importbanking.domain.OverdraftException; publicclassAccount { protecteddoublebalance; //银行帐户的当前(或即时)余额//公有构造器 ,这个参数为 balance 属性赋值publicAccount(doubleinit_balance) { this.balance=init_balance; } //用于获取经常余额publicdoublegetBalance() { returnbalance; } /*** 向当前余额增加金额* @param amt 增加金额* @return 返回 true(意味所有存款是成功的)*/publicbooleandeposit(doubleamt){ balance+=amt; returntrue; } /*** 从当前余额中减去金额* @param amt 提款数目* @return 如果 amt小于 balance, 则从余额中扣除提款数目并返回 true,否则余额不变返回 false。*/publicvoidwithdraw(doubleamt) throwsOverdraftException { if (amt<balance){ balance-=amt; }else{ thrownewOverdraftException("资金不足",balance-amt); } } }
【Customer.java】类
packagebanking; importjava.util.ArrayList; importjava.util.Iterator; importjava.util.List; publicclassCustomer { privateStringfirstName; privateStringlastName; privateList<Account>accounts=newArrayList<>(); publicCustomer(Stringf, Stringl) { this.firstName=f; this.lastName=l; } publicStringgetFirstName() { returnfirstName; } publicStringgetLastName() { returnlastName; } /*** 通过下标索引获取 account* @param index 下标索引* @return account*/publicAccountgetAccount(intindex) { returnaccounts.get(index); } /*** 获取 accounts 集合的大小* @return accounts.size()*/publicintgetNumOfAccounts() { returnaccounts.size(); } /*** 方法返回一个帐户列表上的 iterator* @return 方法返回一个帐户列表上的 iterator*/publicIterator<Account>getAccounts(){ returnaccounts.iterator(); } /*** 添加 account* @param acct account*/publicvoidaddAccount(Accountacct) { accounts.add(acct); } }
【Bank.java】类
packagebanking; importjava.util.ArrayList; importjava.util.Iterator; importjava.util.List; /*** 银行类*/publicclassBank { privateList<Customer>customers; //Customer对象的数组privatestaticBankbankInstance=null; /*** getBanking 的公有静态方法,它返回一个 Bank 类的实例。* @return 返回一个 Bank 类的实例。*/publicstaticBankgetBank(){ if(bankInstance==null){ bankInstance=newBank(); } returnbankInstance; } /*** 单例模式中构造器也应该是私有的,以合适的最大尺寸(至少大于 5)初始化 customers 数组。*/privateBank() { customers=newArrayList<>(); } /*** 该方法必须依照参数(姓,名)构造一个新的 Customer 对象然后把它放到 customer 数组中。还必须把 numberOfCustomers 属性的值加 1。* @param f 姓* @param l 名*/publicvoidaddCustomer(Stringf,Stringl){ customers.add(newCustomer(f,l)); } /**** @return 返回一个客户列表上的 iterator*/publicIterator<Customer>getCustomers(){ returncustomers.iterator(); } /*** 通过下标索引获取 customer* @param index 下标索引* @return customer*/publicCustomergetCustomer(intindex) { returncustomers.get(index); } publicintgetNumOfCustomers() { returncustomers.size(); } }
【CheckingAccount.java】类
packagebanking; importbanking.domain.OverdraftException; publicclassCheckingAccountextendsAccount{ privatedoubleoverdraftProtection; publicCheckingAccount(doublebalance) { super(balance); } publicCheckingAccount(doublebalance, doubleprotect) { super(balance); this.overdraftProtection=protect; } /*** 此方法必须执行下列检查。如 果当前余额足够弥补取款 amount,则正常进行。* 如果不够弥补但是存在透支保护,则尝试用 overdraftProtection 得值来弥补该差值(balance-amount).* 如果弥补该透支所需要的金额大于当前的保护级别。则整个交易失败,但余额未受影响。* @param amt 提款数目* @return 返回true代表交易成功,否则交易失败*/publicvoidwithdraw(doubleamt) throwsOverdraftException { if (balance<amt){ if(overdraftProtection==0){ thrownewOverdraftException("no overdraft protection",amt-balance); } if (amt-balance>overdraftProtection) { thrownewOverdraftException("Insufficient funds for overdraft protection",amt); }else { overdraftProtection-=amt-balance; balance=0; } }else { balance-=amt; } } }
【SavingsAccount.java】类
packagebanking; publicclassSavingsAccountextendsAccount{ privatedoubleinterestRate; publicSavingsAccount(doublebalance, doubleinterest_Rate) { super(balance); this.interestRate=interest_Rate; } }
【CustomerReport.java】类
packagebanking.reports; importbanking.Account; importbanking.Bank; importbanking.Customer; importbanking.SavingsAccount; importjava.util.Iterator; publicclassCustomerReport { /*** 使用 Iterator 实现对客户的迭代生成客户报告,Generate a report*/publicvoidgenerateReport(){ Bankbank=Bank.getBank(); System.out.println("\t\t\tCUSTOMERS REPORT"); System.out.println("\t\t\t================"); Iterator<Customer>customers=bank.getCustomers(); while(customers.hasNext()){ Customercustomer=customers.next(); System.out.println(); System.out.println("Customer: "+customer.getLastName() +", "+customer.getFirstName()); Iterator<Account>customerAccounts=customer.getAccounts(); while (customerAccounts.hasNext()){ Accountaccount=customerAccounts.next(); Stringaccount_type=""; // Determine the account type/*** Step 1:**** Use the instanceof operator to test what type of account**** we have and set account_type to an appropriate value, such**** as "Savings Account" or "Checking Account".***/if (accountinstanceofSavingsAccount) { account_type="Savings Account"; } else { account_type="Checking Account"; } // Print the current balance of the account/*** Step 2:**** Print out the type of account and the balance.**** Feel free to use the currency_format formatter**** to generate a "currency string" for the balance.***/System.out.println("\t"+account_type+": current balance is ¥"+account.getBalance()); } } } }
【OverdraftException.java】类
packagebanking.domain; /*** 自定义异常类*/publicclassOverdraftExceptionextendsException{ privatedoubledeficit; publicOverdraftException(Stringmessage, doubledeficit) { super(message); this.deficit=deficit; } publicdoublegetDeficit() { returndeficit; } }
【TestBanking.java】类
packagebanking;/** This class creates the program to test the banking classes.* It creates a set of customers, with a few accounts each,* and generates a report of current account balances.*/importbanking.domain.*; importbanking.reports.CustomerReport; publicclassTestBanking { publicstaticvoidmain(String[] args) { Bankbank=Bank.getBank(); Customercustomer; CustomerReportreport=newCustomerReport(); // Create several customers and their accountsbank.addCustomer("Jane", "Simms"); customer=bank.getCustomer(0); customer.addAccount(newSavingsAccount(500.00, 0.05)); customer.addAccount(newCheckingAccount(200.00, 400.00)); bank.addCustomer("Owen", "Bryant"); customer=bank.getCustomer(1); customer.addAccount(newCheckingAccount(200.00)); bank.addCustomer("Tim", "Soley"); customer=bank.getCustomer(2); customer.addAccount(newSavingsAccount(1500.00, 0.05)); customer.addAccount(newCheckingAccount(200.00)); bank.addCustomer("Maria", "Soley"); customer=bank.getCustomer(3); // Maria and Tim have a shared checking accountcustomer.addAccount(bank.getCustomer(2).getAccount(1)); customer.addAccount(newSavingsAccount(150.00, 0.05)); // Generate a reportreport.generateReport(); } }