银行账户(设计模式--状态模式)

    题目描述:某银行系统中定义了账户的三种状态:

(1)如果账户(Account)余额不小于0,账户状态为绿色,即正常状态,既可以存,也可以取款;

(2)如果余额小于0,并且大于等于-1000,账户状态为蓝色,即欠费状态,既可以存,也可以取款;

(3)如果账户中余额小于-1000,账户状态为红色,即透支状态,只能存款,不能取款。

    实现截图:

                                    

    UML图:

 

 

                              

    ATM.java

package bank_state_5;

public class ATM {
    /*所有状态*/
    private ATMState readyState;
    private ATMState noCashState;
    private ATMState noServiceState;

    private ATMState currState;//当前状态
    private int totalAmount;//账户现钞总数

    /*测试用的临时变量*/
    private String pwd;//密码
    private int balance;//余额
    private int amount;//取款金额

    public ATM(int totalAmount, int balance, int amount, String pwd) throws Exception{
        //初始化所有状态
        readyState = new ReadyState(this);
        noCashState = new NoCashState(this);
        noServiceState = new NoServiceState(this);

        if(totalAmount > 0){
            currState = readyState;
        }
        else if(totalAmount == 0){
            currState = noCashState;
        }
        else{
            throw new Exception();
        }

        //初始化测试数据
        this.totalAmount = totalAmount;
        this.balance = balance;
        this.amount = amount;
        this.pwd = pwd;
    }

    /*把具体行为委托给状态对象*/
    /**
     * 插卡
     */
    public void insertCard(){
        currState.insertCard();
    }

    /**
     * 提交密码
     */
    public void submitPwd(){
        currState.submitPwd();
    }

    /**
     * 取款
     */
    public void getCash(){
        currState.getCash();
    }

    /**
     * 查询余额
     */
    public void queryBalance(){
        currState.queryBalance();
    }

    /**
     * 取卡
     */
    public void ejectCard(){
        currState.ejectCard();
    }
    public String toString(){
        return "账户总额¥" + totalAmount;
    }
    public String SKT() {
        if(totalAmount >= 0) {
            return  "账户状态为绿色正常状态,既可以存,也可以取款";
        }
        if(totalAmount >= -1000 && totalAmount < 0) {
            return "账户状态为蓝色欠费状态,既可以存,也可以取款";
        }
        if(totalAmount < -1000) {
            return "账户状态为红色透支状态,只能存款";
        }
        return "";
    }

    /*此处略去大量getter and setter*/

    public String getPwd(){
        return pwd;
    }
    public int getBalance() {
        return balance;
    }
    public int getTotalAmount() {
        return totalAmount;
    }
    public int getAmount() {
        return amount;
    }

    public void setTotalAmount(int totalAmount) {
        this.totalAmount = totalAmount;
    }

    public void setBalance(int balance) {
        this.balance = balance;
    }

    public ATMState getNoCashState() {
        return noCashState;
    }

    public void setCurrState(ATMState currState) {
        this.currState = currState;
    }
}

     ATMState.java

package bank_state_5;

public interface ATMState {
    public abstract void insertCard();
    public abstract void submitPwd();
    public abstract void getCash();
    public abstract void queryBalance();
    public abstract void ejectCard();
}

     NoCashState.java

package bank_state_5;

public class NoCashState implements ATMState{
    private ATM atm;//保留状态持有者的引用,以便对其进行操作

    public NoCashState(ATM atm){
        this.atm = atm;
    }

    @Override
    public void insertCard() {
        System.out.println("插卡完成");
    }

    @Override
    public void submitPwd() {
        System.out.println("密码提交完成");
        //验证密码并做相应处理
        if("123".equals(atm.getPwd())){
            System.out.println("密码验证通过");
        }
        else{
            System.out.println("密码验证失败");
            //弹出卡片
            ejectCard();
        }
    }

    @Override
    public void getCash() {
        System.out.println("取款失败,机内无钞");
    }

    @Override
    public void queryBalance() {
        System.out.println("账户余额¥" + atm.getBalance());
        System.out.println("账户余额查询完成");
    }

    @Override
    public void ejectCard() {
        System.out.println("取卡完成");
    }
}

    NoServiceState.java

package bank_state_5;

public class NoServiceState implements ATMState{
    private ATM atm;//保留状态持有者的引用,以便对其进行操作

    public NoServiceState(ATM atm){
        this.atm = atm;
    }

    @Override
    public void insertCard() {
        System.out.println("插卡失败,机器发生了故障");
    }

    @Override
    public void submitPwd() {
        System.out.println("密码提交失败,机器发生了故障");
    }

    @Override
    public void getCash() {
        System.out.println("取款失败,机器发生了故障");
    }

    @Override
    public void queryBalance() {
        System.out.println("余额查询失败,机器发生了故障");
    }

    @Override
    public void ejectCard() {
        System.out.println("取卡失败,机器发生了故障");
    }
}

    ReadyState.java

package bank_state_5;

public class ReadyState implements ATMState{
    private ATM atm;//保留状态持有者的引用,以便对其进行操作
    public ReadyState(ATM atm){
        this.atm = atm;
    }

    @Override
    public void insertCard() {
        System.out.println("插卡完成");
    }
    @Override
    public void submitPwd() {
        System.out.println("密码提交完成");
        //验证密码并做相应处理
        if("6300".equals(atm.getPwd())){
            System.out.println("密码验证通过");
        }
        else{
            System.out.println("密码验证失败");
            //弹出卡片
            ejectCard();
        }
    }

    @Override
    public void getCash() {
        //atm.getTotalAmount() >= atm.getAmount() && atm.getBalance() >= atm.getAmount()
        if(atm.getTotalAmount() != 9999){
            //更新账户余额
            atm.setBalance(atm.getBalance() - atm.getAmount());
            //更新机内现钞总数
            atm.setTotalAmount(atm.getTotalAmount() - atm.getAmount());
            System.out.println("吐出¥" + atm.getAmount());
            System.out.println("取款完成");
            //弹出卡片
            ejectCard();
            //检查机内余钞
            if(atm.getTotalAmount() == 0){//若无钞,切换到NoService状态
                atm.setCurrState(atm.getNoCashState());
                System.out.println("无钞信息已经发送至银行");
            }
        }
        else{
            System.out.println("取款失败,余额不足");
            //弹出卡片
            ejectCard();
        }
    }

    @Override
    public void queryBalance() {
        System.out.println("余额¥" + atm.getBalance());
        System.out.println("余额查询完成");
    }

    @Override
    public void ejectCard() {
        System.out.println("取卡完成");
    }
}

    test.java

package bank_state_5;

public class shijian5_yinhangzhanghu {
    public static void main(String[] args) {
        /*测试数据*/
        /* 机内总数  账户余额    取款金额   密码
         * 1000 500     200     123
         * 1000 300     500     123
         * 0    500     200     123
         * */
        try {
            test(1000, 500, 200, "6300");
            System.out.println("------------------------------------------------------------");
            test(1000, 300, 1500, "6300");
            System.out.println("------------------------------------------------------------");
            test(-1500, 500, 200, "6300");
        } catch (Exception e) {
            System.out.println("账户余额小于-1000,账户状态为红色透支状态,请存钱后再取");
            //System.out.println("机器故障,维修请求已经发送至维修方");
        }
    }

    private static void test(int totalAmount, int balance, int amount, String pwd)throws Exception{
        //创建ATM
        ATM atm;
        atm = new ATM(totalAmount, balance, amount, pwd);
        //输出初始状态
        System.out.println(atm.toString());
        System.out.println(atm.SKT());
        atm.insertCard();
        atm.submitPwd();
        atm.getCash();
        //输出结束状态
        System.out.println(atm.toString());
    }
}

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 在这个问题中,我们需要将银行账户管理的抽象部分与实现部分分离,使它们可以独立地变化。在这里,我们将抽象部分定义银行账户类 `BankAccount`,并将其实现部分定义账户管理类 `AccountManager`。 首先,我们定义一个抽象类 `BankAccount`,它包含了银行账户的一些基本属性和方法,比如账户名、余额、存款、取款等。然后我们定义具体的银行账户类(如 `SavingAccount`、`CheckingAccount` 等),它们都继承自 `BankAccount` 类,并实现其抽象方法。 接下来,我们需要定义一个桥接类 `AccountManager`,它作为连接抽象类和具体银行账户类的桥梁。`AccountManager` 类包含一个 `BankAccount` 类型的属性,表示具体银行账户的实现。在 `AccountManager` 类中,我们可以定义一些方法,比如查询余额、存款、取款等,这些方法都是通过调用 `BankAccount` 类中的方法来实现的。 最后,我们只需要在客户端代码中选择具体的银行账户类,创建一个 `AccountManager` 对象,并调用其中的方法,就可以实现银行账户管理的功能了。 下面是这个设计模式的示意代码: ```java // 抽象类 BankAccount public abstract class BankAccount { protected String accountName; protected double balance; public BankAccount(String accountName, double balance) { this.accountName = accountName; this.balance = balance; } public abstract void deposit(double amount); public abstract void withdraw(double amount); public String getAccountName() { return accountName; } public double getBalance() { return balance; } } // 具体银行账户类 SavingAccount public class SavingAccount extends BankAccount { public SavingAccount(String accountName, double balance) { super(accountName, balance); } public void deposit(double amount) { balance += amount; System.out.println("Deposit " + amount + " to " + accountName + ", balance: " + balance); } public void withdraw(double amount) { if (balance >= amount) { balance -= amount; System.out.println("Withdraw " + amount + " from " + accountName + ", balance: " + balance); } else { System.out.println("Insufficient balance!"); } } } // 具体银行账户类 CheckingAccount public class CheckingAccount extends BankAccount { public CheckingAccount(String accountName, double balance) { super(accountName, balance); } public void deposit(double amount) { balance += amount; System.out.println("Deposit " + amount + " to " + accountName + ", balance: " + balance); } public void withdraw(double amount) { if (balance >= amount) { balance -= amount; System.out.println("Withdraw " + amount + " from " + accountName + ", balance: " + balance); } else { System.out.println("Insufficient balance!"); } } } // 桥接类 AccountManager public class AccountManager { private BankAccount bankAccount; public AccountManager(BankAccount bankAccount) { this.bankAccount = bankAccount; } public void deposit(double amount) { bankAccount.deposit(amount); } public void withdraw(double amount) { bankAccount.withdraw(amount); } public void showBalance() { System.out.println("Account: " + bankAccount.getAccountName() + ", balance: " + bankAccount.getBalance()); } } // 客户端代码 public class Client { public static void main(String[] args) { // 创建具体银行账户类对象 SavingAccount savingAccount = new SavingAccount("Saving Account", 1000); CheckingAccount checkingAccount = new CheckingAccount("Checking Account", 2000); // 创建桥接类对象 AccountManager savingAccountManager = new AccountManager(savingAccount); AccountManager checkingAccountManager = new AccountManager(checkingAccount); // 存款和取款 savingAccountManager.deposit(500); savingAccountManager.withdraw(200); checkingAccountManager.deposit(1000); checkingAccountManager.withdraw(500); // 查询余额 savingAccountManager.showBalance(); checkingAccountManager.showBalance(); } } ``` 在这个示例代码中,我们定义了一个 `BankAccount` 抽象类和两个具体银行账户类(`SavingAccount`、`CheckingAccount`)。然后我们定义了一个 `AccountManager` 桥接类,它将具体银行账户类和抽象类连接起来。 在客户端代码中,我们创建了具体银行账户类对象和桥接类对象,并调用其中的方法来实现银行账户管理的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值