דצמ.24

State Pattern

State Pattern

State Pattern - אחד הפאטרנים הכי חשובים שיש. דוגמה של כספומט:

בדרך כלל State Pattern מורכב משלושה חלקים:

1. Context  - ישות שמשתמש ניגש אליה:

  1. public class ATM {
  2. public ATMState currentState = null;
  3. public ATM() {
  4. currentState = new NoCardState(1000, this);
  5. }
  6. public void StartTheATM() {
  7. while (true) {
  8. Console.WriteLine(currentState.GetNextScreen());
  9. }
  10. }
  11. }

2. State - זה Interface או Abstract class שמגדיר כל המצבים האפשריים של Context:

  1. public abstract class ATMState {
  2. public ATM Atm { get; get; }
  3. public int DummyCashPresent { get;set; } = 1000;
  4. public abstract string GetNextScreen();
  5. }

3. Concrete State - מצב של Context. לכל מצב יהיה class משלו.:

  1. public class NoCardState : ATMState {
  2. public NoCardState(ATMState state):this(state.DummyCashPresent, state.Atm) {
  3. }
  4. public NoCardState(int amountRemaining, ATM atmBeingUsed) {
  5. this.Atm = atmBeingUsed;
  6. this.DummyCashPresent = amountRemaining;
  7. }
  8. public override string GetNextScreen() {
  9. Console.WriteLine("Please enter your pin");
  10. string userInput = Console.ReadLine();
  11. if (userInput.Trim() == "1234") {
  12. UpdateState();
  13. return "Enter the amount to withdraw";
  14. }
  15. return "Invalid PIN";
  16. }
  17. private void UpdateState() {
  18. Atm.currentState = new CardValidatedState(this);
  19. }
  20. }
  21.  
  22. public class CardValidatedState : ATMState {
  23. public CardValidatedState(ATMState state):this(state.DummyCashPresent, state.Atm){
  24. }
  25. public CardValidatedState(int amountRemaining, ATM atmBeingUsed) {
  26. this.Atm = atmBeingUsed;
  27. this.DummyCashPresent = amountRemaining;
  28. }
  29. public override string GetNextScreen() {
  30. string userInput = Console.ReadLine();
  31. int requestAmount;
  32. bool result = Int32.TryParse(userInput, out requestAmount);
  33. if (result == true) {
  34. if (this.DummyCashPresent < requestAmount) {
  35. return "Amount not present";
  36. }
  37. this.DummyCashPresent -= requestAmount;
  38. UpdateState();
  39.  
  40. return $"Amount of {requestAmount} has been withdrawn. Press Enter to proceed";
  41. }
  42. return "Invalid amount";
  43. }
  44.  
  45. private void UpdateState() {
  46. Atm.currentState = new NoCashState(this);
  47. }
  48. }


תגיות:
שתף את הסיפור הזה:

תגובות(0)

השאירו תגובה

קפטצ'ה לא מתאימה

תגובה