泡泡

              宠辱不惊-闲看庭前花开花落
                           去留无意-漫观天外云展云舒
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

20)State

Posted on 2007-09-21 16:46  AlanPaoPao  阅读(108)  评论(0)    收藏  举报
    状态模式的目的是: 引入一组表示对象状态的类,把于状态相关的代码逻辑分配到这些类中
    实例代码:
class Account
{
  
private State state;
  
private string owner;
  
public Account(string owner)
  
{
    
this.owner = owner;
    state 
= new SilverState(0.0this);
  }

  
public double Balance
  
{
    
get return state.Balance; }
  }

  
public State State
  
{
    
get return state; }
    
set { state = value; }
  }

  
public void Deposit(double amount)
  
{
    state.Deposit(amount);
    Console.WriteLine(
"Deposited {0:C} --- ", amount);
    Console.WriteLine(
" Balance = {0:C}"this.Balance);
    Console.WriteLine(
" Status = {0}\n"this.State.GetType().Name);
    Console.WriteLine(
"");
  }

  
public void Withdraw(double amount)
  
{
    state.Withdraw(amount);
    Console.WriteLine(
"Withdrew {0:C} --- ", amount);
    Console.WriteLine(
" Balance = {0:C}"this.Balance);
    Console.WriteLine(
" Status = {0}\n"this.State.GetType().Name);
  }

  
public void PayInterest()
  
{
    state.PayInterest();
    Console.WriteLine(
"Interest Paid --- ");
    Console.WriteLine(
" Balance = {0:C}"this.Balance);
    Console.WriteLine(
" Status = {0}\n"this.State.GetType().Name);
  }

}

abstract class State
{
  
protected Account account;
  
protected double balance;
  
protected double interest;
  
protected double lowerLimit;
  
protected double upperLimit;
  
public Account Account
  
{
    
get return account; }
    
set { account = value; }
  }

  
public double Balance
  
{
    
get return balance; }
    
set { balance = value; }
  }

  
public abstract void Deposit(double amount);
  
public abstract void Withdraw(double amount);
  
public abstract void PayInterest();
}

class RedState : State
{
  
double serviceFee;
  
public RedState(State state)
  
{
    
this.balance = state.Balance;
    
this.account = state.Account;
    Initialize();
  }

  
private void Initialize()
  
{
    interest 
= 0.0;
    lowerLimit 
= -100.0;
    upperLimit 
= 0.0;
    serviceFee 
= 15.00;
  }

  
public override void Deposit(double amount)
  
{
    balance 
+= amount;
    StateChangeCheck();
  }

  
public override void Withdraw(double amount)
  
{
    amount 
= amount - serviceFee;
    Console.WriteLine(
"No funds available for withdrawal!");
  }

  
public override void PayInterest()
  
{
  }

  
private void StateChangeCheck()
  
{
    
if (balance > upperLimit)
    
{
      account.State 
= new SilverState(this);
    }

  }

}

class SilverState : State
{
  
public SilverState(State state)
    :
this(state.Balance, state.Account)
  
{
  }

  
public SilverState(double balance, Account account)
  
{
    
this.balance = balance;
    
this.account = account;
    Initialize();
  }

  
private void Initialize()
  
{
    interest 
= 0.0;
    lowerLimit 
= 0.0;
    upperLimit 
= 1000.0;
  }

  
public override void Deposit(double amount)
  
{
    balance 
+= amount;
    StateChangeCheck();
  }

  
public override void Withdraw(double amount)
  
{
    balance 
-= amount;
    StateChangeCheck();
  }

  
public override void PayInterest()
  
{
    balance 
+= interest * balance;
    StateChangeCheck();
  }

  
private void StateChangeCheck()
  
{
    
if (balance < lowerLimit)
    
{
      account.State 
= new RedState(this);
    }

    
else if (balance > upperLimit)
    
{
      account.State 
= new GoldState(this);
    }

  }

}

class GoldState : State
{
  
public GoldState(State state)
    : 
this(state.Balance, state.Account)
  
{
  }

  
public GoldState(double balance, Account account)
  
{
    
this.balance = balance;
    
this.account = account;
    Initialize();
  }

  
private void Initialize()
  
{
    interest 
= 0.05;
    lowerLimit 
= 1000.0;
    upperLimit 
= 10000000.0;
  }

  
public override void Deposit(double amount)
  
{
    balance 
+= amount;
    StateChangeCheck();
  }

  
public override void Withdraw(double amount)
  
{
    balance 
-= amount;
    StateChangeCheck();
  }

  
public override void PayInterest()
  
{
    balance 
+= interest * balance;
    StateChangeCheck();
  }

  
private void StateChangeCheck()
  
{
    
if (balance < 0.0)
    
{
      account.State 
= new RedState(this);
    }

    
else if (balance < lowerLimit)
    
{
      account.State 
= new SilverState(this);
    }

  }

}

class MainApp
{
  
static void Main()
  
{
    Account account 
= new Account("Jim Johnson");
    account.Deposit(
500.0);
    account.Deposit(
300.0);
    account.Deposit(
550.0);
    account.PayInterest();
    account.Withdraw(
2000.00);
    account.Withdraw(
1100.00);
    Console.Read();
  }

}