软件设计-状态模式

技术软件设计-状态模式 软件设计-状态模式银行账户用Java代码模拟实现课堂上的“银行账户”的实例,要求编写客户端测试代码模拟用户存款和取款,注意账户对象状态和行为的变化。类图源代码
Javapacka

软件设计-状态模式

银行账户

用Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)代码模拟实现课堂上的"银行账户"的实例,要求编写客户端测试代码模拟用户存款和取款,注意账户对象状态和行为的变化。

类图

源代码

Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)

包rjsj.no22

公共类绿色状态扩展了AccountState{

公共绿色状态(双余额,帐户ACC){ 0

这个. balance=余额;

此. account=acc

this.stateName='正常状态;

}

}

包rjsj.no22

公共类红色状态扩展了AccountState{

公共状态(帐户状态){ 0

这个。平衡=状态。平衡;

这个。帐户=状态。账户;

this.stateName='透支状态;

}

公开作废提款(双倍金额){ 0

系统。出去。println(帐户。getowner())取款金额);

System.out.println('抱歉,您的账户已处于透支状态,不能取款!');

}

}

包rjsj.no22

公共类黄州扩展了AccountState{

公共黄色状态(帐户状态){ 0

这个。平衡=状态。平衡;

这个。帐户=状态。账户;

this.stateName='欠费状态;

}

}

包rjsj.no22

公共类帐户{

私人账户国家;

私有字符串所有者;

公共帐户状态GetState(){ 0

返回状态;

}

公共void setState(帐户状态状态){ 0

这个.状态=状态

}

公共字符串getOwner(){ 0

归还所有者;

}

公共无效存款(双倍金额){ 0

存款(金额);

}

公开作废提款(双倍金额){ 0

状态。提取(金额);

}

公共帐户(字符串所有者,双initBalance){ 0

this.owner=所有者;

这个。state=new GreenState(initBalance,this);

System.out.println(this.owner)开户成功!银行卡初始金额:' initBalance);

系统。出去。println('-');

}

}

包rjsj.no22

公共抽象类AccountState {

受保护账户账户;//账户名

受保护的双重平衡;//账户金额

受保护的字符串状态名;//当前状态

公共无效存款(双倍金额){ 0

系统。出去。println(帐户。getowner())存款金额);

这个余额=这个余额。

状态检查();

System.out.println('账户余额:“这个。余额);

System.out.println('账户状态:' account.getS

tate().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++

#includeiostream
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=-1000balance0) {
            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=-1000balance0) {
            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=-1000balance0) {
            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){
        coutacc-getOwner()"存款"amountendl;
        this-balance+=amount;
        stateCheck();
        cout"账户余额:"this-balanceendl;
        cout"账户状态:"acc-getState()-stateNameendl;
    }
void AccountState::withdraw(double amount){
        coutacc-getOwner()"取款"amountendl;
        this-balance-=amount;
        stateCheck();
        cout"账户余额:"this-balanceendl;
        cout"账户状态:"acc-getState()-stateNameendl;
    }
Account::Account(string owner,double init){
    this-owner=owner;
    this-state=new GreenState(init,this);
    cout"恭喜"this-owner"开户成功!银行卡初始金额:"initendl;
    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;
}

运行结果:

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/145049.html

(0)

相关推荐

  • 吃什么东西可以补肾,什么食物补肾 ????????

    技术吃什么东西可以补肾,什么食物补肾 ????????介绍肾虚食谱秘方数则如下,希望对您能有所帮助吃什么东西可以补肾。海参粥:水发海参(切碎)50克,粳米100克,同煮成粥,加少许葱姜食盐调味。枸杞猪腰粥:枸杞子10克,

    生活 2021年10月29日
  • centos6.5如何安装jira

    技术centos6.5如何安装jira这篇文章主要为大家展示了“centos6.5如何安装jira”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“centos6.5如何安装ji

    攻略 2021年11月15日
  • 力扣刷题记录Day01

    技术力扣刷题记录Day01 力扣刷题记录Day011816.截断句子
    句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。
    例如

    礼包 2021年12月6日
  • OsgEarth开发笔记,四):Qt5.15.2在QtCreator集成Osg3.6.3+OsgEarth3.1+OsgQt的vs2019x64版本开发环境搭建

    技术OsgEarth开发笔记,四):Qt5.15.2在QtCreator集成Osg3.6.3+OsgEarth3.1+OsgQt的vs2019x64版本开发环境搭建 OsgEarth开发笔记(四):Qt

    礼包 2021年12月24日
  • 怎么使用Java打造一款简单的英语学习系统

    技术怎么使用Java打造一款简单的英语学习系统本篇内容介绍了“怎么使用Java打造一款简单的英语学习系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希

    攻略 2021年10月22日
  • 避免,自媒体视频如何避免侵权

    技术避免,自媒体视频如何避免侵权首先要对于我们自媒体来说,侵权的范围一般来说就是三类避免:视频类,图片类,字体配乐类。独角shou就因为字体侵权被索赔十几万,损失惨重。不过知名度不高的账号的话,一般不会收到音乐字体类的侵

    生活 2021年10月21日