zoukankan      html  css  js  c++  java
  • 处理对象的多种状态及其相互转换—状态模式(三)

    3 完整解决方案

           Sunny软件公司开发人员使用状态模式来解决账户状态的转换问题,客户端只需要执行简单的存款和取款操作,系统根据余额将自动转换到相应的状态,其基本结构如图4所示:

    4 银行账户结构图

           在图4中,Account充当环境类角色,AccountState充当抽象状态角色,NormalStateOverdraftStateRestrictedState充当具体状态角色。完整代码如下所示:

    温馨提示:代码有点长,需要有耐心!大笑

    1. //银行账户:环境类  
    2. class Account  
    3.     private AccountState state; //维持一个对抽象状态对象的引用  
    4.     private String owner; //开户名  
    5.     private double balance 0//账户余额  
    6.       
    7.     public Account(String owner,double init)  
    8.         this.owner owner;  
    9.         this.balance balance;  
    10.         this.state new NormalState(this); //设置初始状态  
    11.         System.out.println(this.owner "开户,初始金额为" init);   
    12.         System.out.println("---------------------------------------------");      
    13.      
    14.       
    15.     public double getBalance()  
    16.         return this.balance;  
    17.      
    18.       
    19.     public void setBalance(double balance)  
    20.         this.balance balance;  
    21.      
    22.       
    23.     public void setState(AccountState state)  
    24.         this.state state;  
    25.      
    26.       
    27.     public void deposit(double amount)  
    28.         System.out.println(this.owner "存款" amount);  
    29.         state.deposit(amount); //调用状态对象的deposit()方法  
    30.         System.out.println("现在余额为"this.balance);  
    31.         System.out.println("现在帐户状态为"this.state.getClass().getName());  
    32.         System.out.println("---------------------------------------------");              
    33.      
    34.       
    35.     public void withdraw(double amount)  
    36.         System.out.println(this.owner "取款" amount);  
    37.         state.withdraw(amount); //调用状态对象的withdraw()方法  
    38.         System.out.println("现在余额为"this.balance);  
    39.         System.out.println("现在帐户状态为"thisstate.getClass().getName());          
    40.         System.out.println("---------------------------------------------");  
    41.      
    42.       
    43.     public void computeInterest()  
    44.      
    45.         state.computeInterest(); //调用状态对象的computeInterest()方法  
    46.      
    47.  
    48.   
    49. //抽象状态类  
    50. abstract class AccountState  
    51.     protected Account acc;  
    52.     public abstract void deposit(double amount);  
    53.     public abstract void withdraw(double amount);  
    54.     public abstract void computeInterest();  
    55.     public abstract void stateCheck();  
    56.  
    57.   
    58. //正常状态:具体状态类  
    59. class NormalState extends AccountState  
    60.     public NormalState(Account acc)  
    61.         this.acc acc;  
    62.      
    63.   
    64. public NormalState(AccountState state)  
    65.         this.acc state.acc;  
    66.      
    67.           
    68.     public void deposit(double amount)  
    69.         acc.setBalance(acc.getBalance() amount);  
    70.         stateCheck();  
    71.      
    72.       
    73.     public void withdraw(double amount)  
    74.         acc.setBalance(acc.getBalance() amount);  
    75.         stateCheck();  
    76.      
    77.       
    78.     public void computeInterest()  
    79.      
    80.         System.out.println("正常状态,无须支付利息!");  
    81.      
    82.       
    83.     //状态转换  
    84.     public void stateCheck()  
    85.         if (acc.getBalance() -2000 && acc.getBalance() <= 0 
    86.             acc.setState(new OverdraftState(this));  
    87.          
    88.         else if (acc.getBalance() == -2000 
    89.             acc.setState(new RestrictedState(this));  
    90.          
    91.         else if (acc.getBalance() -2000 
    92.             System.out.println("操作受限!");  
    93.             
    94.         
    95.    
    96.   
    97. //透支状态:具体状态类  
    98. class OverdraftState extends AccountState  
    99.  
    100.     public OverdraftState(AccountState state)  
    101.         this.acc state.acc;  
    102.      
    103.       
    104.     public void deposit(double amount)  
    105.         acc.setBalance(acc.getBalance() amount);  
    106.         stateCheck();  
    107.      
    108.       
    109.     public void withdraw(double amount)  
    110.         acc.setBalance(acc.getBalance() amount);  
    111.         stateCheck();  
    112.      
    113.       
    114.     public void computeInterest()  
    115.         System.out.println("计算利息!");  
    116.      
    117.       
    118.     //状态转换  
    119.     public void stateCheck()  
    120.         if (acc.getBalance() 0 
    121.             acc.setState(new NormalState(this));  
    122.          
    123.         else if (acc.getBalance() == -2000 
    124.             acc.setState(new RestrictedState(this));  
    125.          
    126.         else if (acc.getBalance() -2000 
    127.             System.out.println("操作受限!");  
    128.          
    129.      
    130.  
    131.   
    132. //受限状态:具体状态类  
    133. class RestrictedState extends AccountState  
    134.     public RestrictedState(AccountState state)  
    135.         this.acc state.acc;  
    136.      
    137.       
    138.     public void deposit(double amount)  
    139.         acc.setBalance(acc.getBalance() amount);  
    140.         stateCheck();  
    141.      
    142.       
    143.     public void withdraw(double amount)  
    144.         System.out.println("帐号受限,取款失败");  
    145.      
    146.       
    147.     public void computeInterest()  
    148.         System.out.println("计算利息!");  
    149.      
    150.       
    151.     //状态转换  
    152.     public void stateCheck()  
    153.         if(acc.getBalance() 0 
    154.             acc.setState(new NormalState(this));  
    155.          
    156.         else if(acc.getBalance() -2000 
    157.             acc.setState(new OverdraftState(this));  
    158.          
    159.      
    160.  

           编写如下客户端测试代码:

    1. class Client  
    2.     public static void main(String args[])  
    3.         Account acc new Account("段誉",0.0);  
    4.         acc.deposit(1000);  
    5.         acc.withdraw(2000);  
    6.         acc.deposit(3000);  
    7.         acc.withdraw(4000);  
    8.         acc.withdraw(1000);  
    9.         acc.computeInterest();  
    10.      
    11.  

           编译并运行程序,输出结果如下:

    段誉开户,初始金额为0.0

    ---------------------------------------------

    段誉存款1000.0

    现在余额为1000.0

    现在帐户状态为NormalState

    ---------------------------------------------

    段誉取款2000.0

    现在余额为-1000.0

    现在帐户状态为OverdraftState

    ---------------------------------------------

    段誉存款3000.0

    现在余额为2000.0

    现在帐户状态为NormalState

    ---------------------------------------------

    段誉取款4000.0

    现在余额为-2000.0

    现在帐户状态为RestrictedState

    ---------------------------------------------

    段誉取款1000.0

    帐号受限,取款失败

    现在余额为-2000.0

    现在帐户状态为RestrictedState

    ---------------------------------------------

    计算利息!


    【作者:刘伟 http://blog.csdn.net/lovelion

  • 相关阅读:
    求某个数的位数公式
    ArrayList和lInkedList比较
    队列
    抽象数据结构-栈
    LinkedList的实现
    ArrayList的实现
    Iterator和List的一些问题
    SCHEMA约束
    DTD约束
    XML解析
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254844.html
Copyright © 2011-2022 走看看