1. 程式人生 > 其它 >c++實現狀態模式

c++實現狀態模式

實驗:用Java程式碼模擬實現課堂上的“銀行賬戶”的例項,要求編寫客戶端測試程式碼模擬使用者存款和取款,注意賬戶物件狀態和行為的變化。

由於是c++,不像java那麼靈活,所以類的呼叫方面出了些許多問題,包括呼叫,出現了很多錯誤,不過好在都解決了。

程式碼:

#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(500); cout<<"------------------------------"<<endl; account->deposit(1000); cout<<"------------------------------"<<endl; account->withdraw(2000); cout<<"------------------------------"<<endl; cout<<account->getState()->stateName; account->withdraw(100); cout<<"------------------------------"<<endl; account->deposit(2000); cout<<"------------------------------"<<endl; return 0; }
View Code1
#include<iostream>
using namespace std;
class Account;
class AccountState{
public:
    Account *acc;
   double balance;
   string stateName;
public:
    virtual void stateCheck()=0;
    virtual void deposit(double amount)=0;
    virtual void withdraw(double amount)=0;
};
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 checkState(){
        state->stateCheck();
    }
    void deposit(double amount) {
        cout<<this->owner<<"存款"<<amount<<endl;
        state->deposit(amount);
        cout<<"賬戶餘額:"<<state->balance<<endl;
        cout<<"現在賬戶狀態:"<<state->stateName<<endl;
    }
    void withdraw(double amount) {
        cout<<this->owner<<"取款"<<amount<<endl;
        state->withdraw(amount);
        cout<<"賬戶餘額"<<state->balance<<endl;
        cout<<"現在賬戶狀態:"<<state->stateName<<endl;
    }
};
class RedState :public AccountState{
public:
    RedState(AccountState *state) {
        this->balance = state->balance;
        this->acc = state->acc;
        this->stateName="透支狀態";
    }
    void stateCheck();
    void deposit(double amount) {
        this->balance+=amount;
        stateCheck();
    }
    void withdraw(double amount) {
          cout<<"您的賬戶處於透支狀態,不能取款!"<<endl;
    }
};
class YellowState :public AccountState{
public:
    YellowState(AccountState *state) {
         this->balance = state->balance;
         this->acc = state->acc;
         this->stateName="欠費狀態";
    }
    void stateCheck();
    void deposit(double amount) {
        this->balance+=amount;
        stateCheck();
    }
    void withdraw(double amount) {
        this->balance-=amount;
        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 deposit(double amount) {
        this->balance+=amount;
        stateCheck();
    }
    void withdraw(double amount) {
        this->balance-=amount;
        stateCheck();
    }
};
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));
        }
}
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(500);
        cout<<"------------------------------"<<endl;
        account->deposit(1000);
        cout<<"------------------------------"<<endl;
        account->withdraw(2000);
        cout<<"------------------------------"<<endl;
        account->withdraw(100);
        cout<<"------------------------------"<<endl;
        account->deposit(2000);
        cout<<"------------------------------"<<endl;
        return 0;
}
View Code2

兩種方法執行結果:

個人覺得第一種比較好。