软件设计实验 22:状态模式

实验 22:状态模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 

1、理解状态模式的动机,掌握该模式的结构;

2、能够利用状态模式解决实际问题。

 

[实验任务一]:银行账户

Java代码模拟实现课堂上的银行账户的实例,要求编写客户端测试代码模拟用户存款和取款,注意账户对象状态和行为的变化。

实验要求:

1. 提交源代码;

 

GreenState.java:
public class GreenState extends AccountState{

    public GreenState(double balance,Account acc) {
        this.balance = balance;
        this.account = acc;
        this.stateName = "正常状态";
    }
}

RedState.java:
public class RedState extends AccountState{

    public RedState(AccountState state) {
        this.balance = state.balance;
        this.account = state.account;
        this.stateName="透支状态";
    }

    public void withdraw(double amount) {
        System.out.println(account.getOwner()+"取款"+amount);
        System.out.println("抱歉,您的账户已处于透支状态,不能取款!");
    }
}

YellowState:
public class YellowState extends AccountState{

    public YellowState(AccountState state) {
        this.balance = state.balance;
        this.account = state.account;
        this.stateName="欠费状态";
    }
}

Account.java:
public class Account {
    private AccountState state;
    private String owner;

    public AccountState getState() {
        return state;
    }

    public void setState(AccountState state) {
        this.state = state;
    }

    public String getOwner() {
        return owner;
    }

    public void deposit(double amount) {
        state.deposit(amount);
    }

    public void withdraw(double amount) {
        state.withdraw(amount);
    }

    public Account(String owner, double initBalance) {
        this.owner = owner;
        this.state = new GreenState(initBalance,this);
        System.out.println(this.owner + "开户成功!银行卡初始金额:" + initBalance);
        System.out.println("----------------------------------------------------");
    }
}

AccountState.java:
public abstract class AccountState {
    protected Account account;//账户名
    protected double balance;//账户金额
    protected String stateName;//当前状态

    public void deposit(double amount) {
        System.out.println(account.getOwner() + "存款" + amount);
        this.balance = this.balance + amount;
        stateCheck();
        System.out.println("账户余额:" + this.balance);
        System.out.println("账户状态:" + account.getState().stateName);
    }

    public void withdraw(double amount) {
        System.out.println(account.getOwner() + "取款" + amount);
        this.balance = this.balance - amount;
        stateCheck();
        System.out.println("账户余额:" + this.balance);
        System.out.println("账户状态:" + account.getState().stateName);
    }

    public void stateCheck(){//状态审查
        if( balance >= -1000 && balance < 0 ) {
            account.setState(new YellowState(this));
        }else if( balance < -1000 ) {
            account.setState(new RedState(this));
        }else if ( balance > 0 ){
            account.setState(new GreenState(this.balance,this.account));
        }
    }
}

Client.java:
public class Client {

    public static void main(String[] args) {
        Account account = new Account("张三",100);
        account.deposit(8888);
        System.out.println("------------------------------");
        account.withdraw(666);
        System.out.println("------------------------------");
        account.deposit(50);
        System.out.println("------------------------------");
        account.withdraw(9000);
        System.out.println("------------------------------");
        account.withdraw(50000);
        System.out.println("------------------------------");
        account.deposit(3000);
        System.out.println("------------------------------");
        account.withdraw(100);
    }
}

 

2. 注意编程规范。

posted @ 2023-11-28 22:17  STDU_DREAM  阅读(13)  评论(0编辑  收藏  举报