24.12.16
實(shí)驗(yàn) 22:狀態(tài)模式
本次實(shí)驗(yàn)屬于模仿型實(shí)驗(yàn),通過(guò)本次實(shí)驗(yàn)學(xué)生將掌握以下內(nèi)容:
1、理解狀態(tài)模式的動(dòng)機(jī),掌握該模式的結(jié)構(gòu);
2、能夠利用狀態(tài)模式解決實(shí)際問(wèn)題。
[實(shí)驗(yàn)任務(wù)一]:銀行賬戶
用Java代碼模擬實(shí)現(xiàn)課堂上的“銀行賬戶”的實(shí)例,要求編寫(xiě)客戶端測(cè)試代碼模擬用戶存款和取款,注意賬戶對(duì)象狀態(tài)和行為的變化。
實(shí)驗(yàn)要求:
1. 畫(huà)出對(duì)應(yīng)的類圖;
2. 提交源代碼;
3. 注意編程規(guī)范。
類圖:

- 源代碼
public class Account {
private AccountState state;
private String owner;
public Account(String owner, double init) {
this.owner = owner;
state = new GreenState(init, this);
System.out.println("賬戶:" + this.owner + ",余額:" + init);
}
public void setState(AccountState state) {
this.state = state;
}
public void deposit(double amount) {
state.deposit(amount);
System.out.println("現(xiàn)金余額為" + this.state.balance);
}
public void withdraw(double amount) {
state.withdraw(amount);
System.out.println("現(xiàn)金余額為" + state.balance);
}
}
public abstract class AccountState {
protected Account acc;
protected double balance;
public abstract void stateCheck();
public abstract void deposit(double amount);
public abstract void withdraw(double amount);
}
public class GreenState extends AccountState {
public GreenState() {}
public GreenState(double amount, Account account) {
balance = amount;
acc = account;
}
@Override
public void stateCheck() {
if (balance >= 0) {
acc.setState(new GreenState(balance, acc));
System.out.println("當(dāng)前為正常(綠色)狀態(tài)");
} else if (balance < 0 && balance >= -1000) {
acc.setState(new YellowState(balance, acc));
System.out.println("當(dāng)前為欠費(fèi)(黃色)狀態(tài)");
} else {
acc.setState(new RedState(balance, acc));
System.out.println("當(dāng)前透支(紅色)狀態(tài)");
}
}
@Override
public void deposit(double amount) {
balance += amount;
System.out.println(balance);
stateCheck();
}
@Override
public void withdraw(double amount) {
balance -= amount;
stateCheck();
}
}
public class RedState extends AccountState {
public RedState(double amount, Account acc) {
this.balance = amount;
this.acc = acc;
}
@Override
public void stateCheck() {
if (balance >= 0) {
acc.setState(new GreenState(balance, acc));
System.out.println("當(dāng)前為正常(綠色)狀態(tài)");
} else if (balance < 0 && balance >= -1000) {
acc.setState(new YellowState(balance, acc));
System.out.println("當(dāng)前為欠費(fèi)(黃色)狀態(tài)");
} else {
acc.setState(new RedState(balance, acc));
System.out.println("當(dāng)前透支(紅色)狀態(tài)");
}
}
@Override
public void deposit(double amount) {
balance += amount;
stateCheck();
}
@Override
public void withdraw(double amount) {
System.out.println("透支狀態(tài),無(wú)法取款!");
}
}
public class YellowState extends AccountState {
public YellowState(double amount, Account acc) {
this.balance = amount;
this.acc = acc;
}
@Override
public void stateCheck() {
if (balance >= 0) {
acc.setState(new GreenState(balance, acc));
System.out.println("當(dāng)前為正常(綠色)狀態(tài)");
} else if (balance < 0 && balance >= -1000) {
acc.setState(new YellowState(balance, acc));
System.out.println("當(dāng)前為欠費(fèi)(黃色)狀態(tài)");
} else {
acc.setState(new RedState(balance, acc));
System.out.println("當(dāng)前透支(紅色)狀態(tài)");
}
}
@Override
public void deposit(double amount) {
balance += amount;
stateCheck();
}
@Override
public void withdraw(double amount) {
balance -= amount;
stateCheck();
}
}
public class Client {
public static void main(String[] args) {
Account acc = new Account("gazikel", 2500);
System.out.println("==========綠色狀態(tài)存錢(qián)===========");
acc.deposit(1500);
System.out.println("------------------------------");
// 綠色狀態(tài)取錢(qián)
System.out.println("==========綠色狀態(tài)取錢(qián)===========");
acc.withdraw(4500);
System.out.println("------------------------------");
// 黃色狀態(tài)存錢(qián)
System.out.println("==========黃色狀態(tài)存錢(qián)===========");
acc.deposit(100);
System.out.println("------------------------------");
// 黃色狀態(tài)取錢(qián)
System.out.println("==========黃色狀態(tài)取錢(qián)===========");
acc.withdraw(700);
System.out.println("------------------------------");
// 紅色狀態(tài)取錢(qián)
System.out.println("==========紅色狀態(tài)取錢(qián)===========");
acc.withdraw(100);
// 紅色狀態(tài)存錢(qián)
System.out.println("==========紅色狀態(tài)存錢(qián)===========");
acc.deposit(1000);
}
}
}
posted on 2024-12-16 17:10 Daniel350 閱讀(10) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)