zoukankan      html  css  js  c++  java
  • 软件设计状态模式

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

    类图

    源代码

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

    运行结果:

  • 相关阅读:
    C#基础笔记(第十四天)
    C#基础笔记(第十三天)
    C#基础整理(二)
    C#基础笔记(第十二天)
    C#基础笔记(第十一天)
    C#基础笔记(第十天)
    C#基础笔记(第九天)
    [PyTorch 学习笔记] 2.3 二十二种 transforms 图片数据预处理方法
    [PyTorch 学习笔记] 2.2 图片预处理 transforms 模块机制
    [PyTorch 学习笔记] 2.1 DataLoader 与 DataSet
  • 原文地址:https://www.cnblogs.com/Arisf/p/15685738.html
Copyright © 2011-2022 走看看