2024/11/26
实验 22:状态模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解状态模式的动机,掌握该模式的结构;
2、能够利用状态模式解决实际问题。
[实验任务一]:银行账户
用Java代码模拟实现课堂上的“银行账户”的实例,要求编写客户端测试代码模拟用户存款和取款,注意账户对象状态和行为的变化。
实验要求:
1. 画出对应的类图;
2. 提交源代码;
package ruanjiansheji.shiyan22;
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;
}
/**
* 存款
* @param amount
*/
public void deposit(double amount) {
state.deposit(amount);
System.out.println("现金余额为" + this.state.balance);
}
/**
* 取款
* @param amount
*/
public void withdraw(double amount){
state.withdraw(amount);
System.out.println("现金余额为" + state.balance);
}
}
package ruanjiansheji.shiyan22;
/**
* 状态抽象类
*/
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);
}
package ruanjiansheji.shiyan22;
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("当前为正常(绿色)状态");
} else if(balance <0 && balance >= -1000) {
acc.setState(new YellowState(balance, acc));
System.out.println("当前为欠费(黄色)状态");
} else {
acc.setState(new RedState(balance, acc));
System.out.println("当前透支(红色)状态");
}
}
@Override
public void deposit(double amount) {
balance += amount;
stateCheck();
}
@Override
public void withdraw(double amount) {
balance -= amount;
stateCheck();
}
}
package ruanjiansheji.shiyan22;
public class Main {
public static void main(String[] args) {
Account acc = new Account("gazikel", 2500);
acc.deposit(1000);
acc.deposit(2000);
acc.withdraw(5000);
acc.withdraw(6000);
acc.deposit(6000);
}
}
package ruanjiansheji.shiyan22;
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("当前为正常(绿色)状态");
} else if(balance <0 && balance >= -1000) {
acc.setState(new YellowState(balance, acc));
System.out.println("当前为欠费(黄色)状态");
} else {
acc.setState(new RedState(balance, acc));
System.out.println("当前透支(红色)状态");
}
}
@Override
public void deposit(double amount) {
balance += amount;
stateCheck();
}
@Override
public void withdraw(double amount) {
System.out.println("透支状态,无法取款!");
}
}
package ruanjiansheji.shiyan22;
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("当前为正常(绿色)状态");
} else if(balance <0 && balance >= -1000) {
acc.setState(new YellowState(balance, acc));
System.out.println("当前为欠费(黄色)状态");
} else {
acc.setState(new RedState(balance, acc));
System.out.println("当前透支(红色)状态");
}
}
@Override
public void deposit(double amount) {
balance += amount;
stateCheck();
}
@Override
public void withdraw(double amount) {
balance -= amount;
stateCheck();
}
}
3. 注意编程规范。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?