实验 22:状态模式

实验 22:状态模式

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

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

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

 
   

 


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

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

实验要求:

1. 提交源代码;

JAVA

package rjsj.no22;

 

public class GreenState extends AccountState{

 

    public GreenState(double balance,Account acc) {

        this.balance = balance;

        this.account = acc;

        this.stateName = "正常状态";

    }

}

package rjsj.no22;

 

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("抱歉,您的账户已处于透支状态,不能取款!");

    }

}

package rjsj.no22;

 

public class YellowState extends AccountState{

 

    public YellowState(AccountState state) {

        this.balance = state.balance;

        this.account = state.account;

        this.stateName="欠费状态";

    }

}

package rjsj.no22;

 

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("----------------------------------------------------");

    }

}

package rjsj.no22;

 

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));

        }

    }

}

package rjsj.no22;

 

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);

    }

}

C++

#include<iostream>

using namespace std;

class Account;

class AccountState{

public:

    Account *acc;

   double balance;

   string stateName;

public:

     virtual void stateCheck()=0;

     void deposit(double amount);

     virtual void withdraw(double amount);

};

class Account{

private:

    AccountState *state;

    string owner;

public:

    Account(string owner,double init);

 

    void setState(AccountState *state) {

        this->state=state;

    }

    AccountState* getState() {

        return this->state;

    }

    string getOwner() {

        return this->owner;

    }

    void deposit(double amount) {

        state->deposit(amount);

    }

    void withdraw(double amount) {

        state->withdraw(amount);

    }

};

class RedState :public AccountState{

public:

    RedState(AccountState *state) {

        this->balance = state->balance;

        this->acc = state->acc;

        this->stateName="透支状态";

    }

    void withdraw(double amount){cout<<"账户处于透支状态,不能取款!"<<endl;}

    void stateCheck();

};

class YellowState :public AccountState{

public:

    YellowState(AccountState *state) {

         this->balance = state->balance;

         this->acc = state->acc;

         this->stateName="欠费状态";

    }

    void stateCheck();

};

class GreenState:public AccountState{

public:

     GreenState(double balance,Account *acc) {

        this->balance = balance;

        this->acc = acc;

        this->stateName="正常状态";

    }

    GreenState(AccountState *state) {

        this->acc=state->acc;

        this->balance=state->balance;

        this->stateName="正常状态";

    }

    void stateCheck() {

        if(balance>=-1000&&balance<0) {

            acc->setState(new YellowState(this));

        }else if(balance<-1000) {

            acc->setState(new RedState(this));

        }

        else{

            acc->setState(new GreenState(this));

        }

    }

};

void RedState::stateCheck(){

    if(balance>=-1000&&balance<0) {

            acc->setState(new YellowState(this));

        }else if(balance<-1000) {

            acc->setState(new RedState(this));

        }

        else {

            acc->setState(new GreenState(this));

        }

}

void YellowState::stateCheck() {

        if(balance>=-1000&&balance<0) {

            acc->setState(new YellowState(this));

        }else if(balance<-1000) {

            acc->setState(new RedState(this));

        }

        else{

            acc->setState(new GreenState(this));

        }

}

void AccountState::deposit(double amount){

        cout<<acc->getOwner()<<"存款"<<amount<<endl;

        this->balance+=amount;

        stateCheck();

        cout<<"账户余额:"<<this->balance<<endl;

        cout<<"账户状态:"<<acc->getState()->stateName<<endl;

    }

void AccountState::withdraw(double amount){

        cout<<acc->getOwner()<<"取款"<<amount<<endl;

        this->balance-=amount;

        stateCheck();

        cout<<"账户余额:"<<this->balance<<endl;

        cout<<"账户状态:"<<acc->getState()->stateName<<endl;

    }

Account::Account(string owner,double init){

    this->owner=owner;

    this->state=new GreenState(init,this);

    cout<<"恭喜"<<this->owner<<"开户成功!银行卡初始金额:"<<init<<endl;

    cout<<"--------------------------------------------------"<<endl;

}

int main(){

        Account *account=new Account("张三",100);

        account->deposit(100);

        cout<<"--------------------------------------------------"<<endl;

        account->withdraw(1000);

        cout<<"--------------------------------------------------"<<endl;

        account->deposit(1000);

        cout<<"--------------------------------------------------"<<endl;

        account->withdraw(2000);

        cout<<"--------------------------------------------------"<<endl;

        account->withdraw(10000);

        cout<<"--------------------------------------------------"<<endl;

        account->withdraw(1);

        cout<<"--------------------------------------------------"<<endl;

        account->deposit(100000);

        cout<<"--------------------------------------------------"<<endl;

        return 0;

}

运行结果:

 

 

 

2. 注意编程规范。

posted @ 2022-11-17 10:32  萧贾jzm  阅读(60)  评论(0编辑  收藏  举报
//歌单id