package tutor22;
public class Client {
public static void main(String args[]){
Account acc=new Account("ZY",100);
acc.deposit(500);
acc.withdraw(300);
acc.withdraw(400);
}
}
class Account {
private AccountState state;
private String owner;
public Account(String a,double b){
owner=a;
state=new Yellowstate(this,b);
state.stateCheck();
}
public void setsta(AccountState a){
state=a;
}
public void deposit(double a){
System.out.println(owner+"存"+a+"元");
state.deposit(a);
state.stateCheck();
System.out.println();
}
public void withdraw(double a){
System.out.println(owner+"取"+a+"元");
state.withdraw(a);
state.stateCheck();
System.out.println();
}
}
abstract class AccountState {
protected Account acc;
protected double balance;
public AccountState(Account a,double b){
super();
acc=a;
balance=b;
}
public abstract void stateCheck();
public void deposit(double amount) {
balance+=amount;
System.out.println("存款成功");
System.out.println("余额为"+balance+"元");
}
public void withdraw(double amount) {
if((balance-amount)>-1000) {
System.out.println("取钱成功!");
balance -= amount;
System.out.println("当前余额:"+balance+"元");
}else {
System.out.println("余额不足!");
System.out.println("当前余额:"+balance+"元");
}
}
}
class Greenstate extends AccountState{
public Greenstate(Account a,double b){
super(a,b);
}
public void stateCheck(){
if(balance<-1000){
acc.setsta(new Redstate(acc,balance));
}else if(balance>=-1000&&balance<0){
acc.setsta(new Yellowstate(acc,balance));
}
}
}
class Redstate extends AccountState {
public Redstate(Account acc, double balance) {
super(acc, balance);
}
public void stateCheck() {
if(balance >= -1000 && balance < 0){
acc.setsta(new Yellowstate(acc, balance));
}else if(balance >= 0){
acc.setsta(new Greenstate(acc,balance));
}
}
public void withdraw(double amount) {
System.out.println("余额不足!");
System.out.println("当前余额:"+balance);
}
}
class Yellowstate extends AccountState {
public Yellowstate(Account acc, double balance) {
super(acc, balance);
}
public void stateCheck() {
if(balance >=0 ){
acc.setsta(new Greenstate(acc,balance));
}else if(balance < -1000){
acc.setsta(new Redstate(acc,balance));
}
}
}