設計模式之狀態模式案例代碼

狀態模式:允許對象在內部改變時改變它的行爲,對象看起來好像修改了它的類。

將狀態封裝成爲對立的類,並將動作委託給當前狀態的對象。

對象在運行過程中,會完全改變他的行爲,好像另一個對象一樣。

案例情景:

ATM機在我們的生活中隨處可見,我們只需插入銀行卡,輸入密碼,輸入取款金額,取走現金。就ok了,方便了我們的生活。我們現在就來模擬這個過程,最後“拿錢走我”

 

1、State.java

 


 
  1. public interface State {

  2. public void takeCash();//取走現金

  3. public void insertCard();//插入銀行卡

  4. public void inputPassword();//輸入銀行卡密碼

  5. public void inputCashCount(int num);//輸入取款金額

  6. }

2、InsertCardState.java

 

 


 
  1. public class InsertCardState implements State{

  2. ATMMachine mAtmMachine;

  3.  
  4. public InsertCardState(ATMMachine atm){

  5. mAtmMachine = atm;

  6. }

  7.  
  8. @Override

  9. public void takeCash() {

  10. System.out.println("請插入銀行卡");

  11. }

  12.  
  13. @Override

  14. public void insertCard() {

  15. System.out.println("正在插入銀行卡");

  16. mAtmMachine.setmState(mAtmMachine.getInputPasswordState());

  17. }

  18.  
  19. @Override

  20. public void inputCashCount(int num) {

  21. System.out.println("請插入銀行卡");

  22. }

  23.  
  24. @Override

  25. public void inputPassword() {

  26. System.out.println("請插入銀行卡");

  27. }

  28.  
  29. }


3、InputPasswordState.java

 

 


 
  1. public class InputPasswordState implements State{

  2. ATMMachine mAtmMachine;

  3.  
  4. public InputPasswordState(ATMMachine atm){

  5. mAtmMachine = atm;

  6. }

  7.  
  8. @Override

  9. public void takeCash() {

  10. System.out.println("請輸入銀行卡密碼");

  11. }

  12.  
  13. @Override

  14. public void insertCard() {

  15. System.out.println("請輸入銀行卡密碼");

  16. }

  17.  
  18. @Override

  19. public void inputCashCount(int num) {

  20. System.out.println("請輸入銀行卡密碼");

  21. }

  22.  
  23. @Override

  24. public void inputPassword() {

  25. System.out.println("輸入銀行卡密碼,正確");

  26. mAtmMachine.setmState(mAtmMachine.getInputCashCountState());

  27. }

  28.  
  29. }


4、InputCashCountState.java

 

 


 
  1. public class InputCashCountState implements State{

  2. ATMMachine mAtmMachine;

  3.  
  4. public InputCashCountState(ATMMachine atm){

  5. mAtmMachine = atm;

  6. }

  7.  
  8. @Override

  9. public void takeCash() {

  10. System.out.println("請輸入取款金額");

  11. }

  12.  
  13. @Override

  14. public void insertCard() {

  15. System.out.println("請輸入取款金額");

  16. }

  17.  
  18. @Override

  19. public void inputCashCount(int num) {

  20. System.out.println("已輸入取款金額,正在出鈔");

  21. mAtmMachine.setCashCount(num);

  22. mAtmMachine.setmState(mAtmMachine.getTakeCashState());

  23. }

  24.  
  25. @Override

  26. public void inputPassword() {

  27. System.out.println("請輸入取款金額");

  28. }

  29.  
  30. }


5、TakeCashState.java

 

 


 
  1. public class TakeCashState implements State{

  2. ATMMachine mAtmMachine;

  3.  
  4. public TakeCashState(ATMMachine atm){

  5. mAtmMachine = atm;

  6. }

  7.  
  8. @Override

  9. public void takeCash() {

  10. System.out.println("鈔票已出,請取走鈔票"+mAtmMachine.getCashCount()+"元");

  11. mAtmMachine.setmState(mAtmMachine.getInsertCardState());

  12. }

  13.  
  14. @Override

  15. public void insertCard() {

  16. System.out.println("你已經插入銀行卡,錢已出,請取走錢");

  17. }

  18.  
  19. @Override

  20. public void inputCashCount(int num) {

  21. System.out.println("錢已出,請取走錢:");

  22. }

  23.  
  24. @Override

  25. public void inputPassword() {

  26. System.out.println("錢已出,請取走錢");

  27. }

  28.  
  29. }


6、ATMMachine.java

 

 


 
  1. public class ATMMachine {

  2. private State takeCashState;

  3. private State insertCardState;

  4. private State inputCashCountState;

  5. private State inputPasswordState;

  6.  
  7. private State mState;

  8.  
  9. private int cashCount;

  10.  
  11. public ATMMachine(){

  12. takeCashState = new TakeCashState(this);

  13. insertCardState = new InsertCardState(this);

  14. inputCashCountState = new InputCashCountState(this);

  15. inputPasswordState = new InputPasswordState(this);

  16. mState = insertCardState;

  17. }

  18.  
  19. public void insertCard(){

  20. mState.insertCard();

  21. }

  22.  
  23. public void takeCash(){

  24. mState.takeCash();

  25. }

  26.  
  27. public void inputCashCount(int num){

  28. mState.inputCashCount(num);

  29. }

  30.  
  31. public void inputPassword(){

  32. mState.inputPassword();

  33. }

  34.  
  35. public State getTakeCashState() {

  36. return takeCashState;

  37. }

  38.  
  39. public State getInsertCardState() {

  40. return insertCardState;

  41. }

  42.  
  43. public State getInputCashCountState() {

  44. return inputCashCountState;

  45. }

  46.  
  47. public void setmState(State mState) {

  48. this.mState = mState;

  49. }

  50.  
  51. public State getInputPasswordState() {

  52. return inputPasswordState;

  53. }

  54.  
  55. public int getCashCount() {

  56. return cashCount;

  57. }

  58.  
  59. public void setCashCount(int cashCount) {

  60. this.cashCount = cashCount;

  61. }

  62.  
  63. }


7、Test.java

 

 


 
  1. public class Test {

  2. public static void main(String args[]){

  3. ATMMachine atm = new ATMMachine();

  4.  
  5. System.out.println("拿錢走我");

  6. atm.takeCash();//直接取錢走人,這不是搶嗎?當然不行

  7. System.out.println("------------------------------------");

  8.  
  9. System.out.println("想的太好了,怎麼可能那,先需要插入銀行卡");

  10. atm.insertCard();

  11. System.out.println("------------------------------------");

  12.  
  13. System.out.println("現在可以取錢走我了吧");

  14. atm.takeCash();

  15. System.out.println("------------------------------------");

  16.  
  17. System.out.println("想的還是太好了,需要輸入密碼");

  18. atm.inputPassword();

  19. System.out.println("------------------------------------");

  20.  
  21. System.out.println("現在可以拿錢走我了吧,等等,還需要輸入多少錢");

  22. atm.inputCashCount(2000);

  23. System.out.println("------------------------------------");

  24.  
  25. System.out.println("現在可以拿錢走我了吧");

  26. atm.takeCash();

  27. }

  28. }


輸出結果:

 

 


 
  1. 拿錢走我

  2. 請插入銀行卡

  3. ------------------------------------

  4. 想的太好了,怎麼可能那,先需要插入銀行卡

  5. 正在插入銀行卡

  6. ------------------------------------

  7. 現在可以取錢走我了吧

  8. 請輸入銀行卡密碼

  9. ------------------------------------

  10. 想的還是太好了,需要輸入密碼

  11. 輸入銀行卡密碼,正確

  12. ------------------------------------

  13. 現在可以拿錢走我了吧,等等,還需要輸入多少錢

  14. 已輸入取款金額,正在出鈔

  15. ------------------------------------

  16. 現在可以拿錢走我了吧

  17. 鈔票已出,請取走鈔票2000元


總結:

 

狀態模式允許隨着狀態的改變,改變狀態的行爲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章