状态模式

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 
  7 namespace Club
  8 {
  9     class Program
 10     {
 11         static void Main(string[] args)
 12         {
 13             Account account = new Account("Tom", 100);
 14             Console.WriteLine("Already!");
 15             Console.WriteLine("Name:{0}", account.Owner);
 16             Console.WriteLine("Initial:{0}", account.Balance);
 17             Console.WriteLine("-----------------------------------------");
 18 
 19             account.Deposit(100);
 20             Console.WriteLine("-----------------------------------------");
 21 
 22             account.Cost(300);
 23             Console.WriteLine("-----------------------------------------");
 24 
 25             account.Deposit(1000);
 26             Console.WriteLine("-----------------------------------------");
 27 
 28             account.Cost(700);
 29             Console.WriteLine("-----------------------------------------");
 30 
 31             Console.ReadLine();
 32         }
 33     }
 34 }
 35 class Account
 36 {
 37     public ClientState State { get; set; }
 38     public string Owner { get; set; }
 39     public double Balance { get; set; }
 40 
 41     public Account(string owner, double initialAmount)
 42     {
 43         Owner = owner;
 44         Balance = initialAmount;
 45         State = new VistorState(this);
 46     }
 47 
 48     public void SetBalance(double amount)
 49     {
 50         Balance = amount;
 51     }
 52 
 53     public void Deposit(double amount)
 54     {
 55         Console.WriteLine("Now,deposit {0}.", amount);
 56         State.Deposit(amount);
 57         Console.WriteLine("ClientState turn to {0}", State);
 58     }
 59 
 60     public void Cost(double amount)
 61     {
 62         Console.WriteLine("Now,Cost {0}.", amount);
 63         State.Cost(amount);
 64         Console.WriteLine("ClientState turn to {0}", State);
 65     }
 66 }
 67 abstract class ClientState
 68 {
 69     protected Account Account;
 70     public abstract void Deposit(double amount);
 71     public abstract void Cost(double amount);
 72     public abstract void Check();
 73 }
 74 class VistorState : ClientState
 75 {
 76     public VistorState(Account account)
 77     {
 78         Account = account;
 79     }
 80 
 81     public override void Deposit(double amount)
 82     {
 83         Account.Balance += amount;
 84         Console.WriteLine("Deposit {0} to {1},surplus of account have {2} affter deposit", amount, Account.Owner, Account.Balance);
 85         Check();
 86     }
 87 
 88     public override void Cost(double amount)
 89     {
 90         double newBalance = Account.Balance - amount;
 91         Account.Balance -= amount;
 92         Console.WriteLine("Cost {0} from {1},surplus of account have {2} affter cost", amount, Account.Owner, Account.Balance);
 93         Check();
 94     }
 95     public override void Check()
 96     {
 97         if (Account.Balance > 100 && Account.Balance < 1000)
 98         {
 99             Account.State = new MemberState(Account);
100         }
101         else if (Account.Balance >= 1000)
102         {
103             Account.State = new VIPState(Account);
104         }
105     }
106 }
107 class MemberState : ClientState
108 {
109     public MemberState(Account account)
110     {
111         Account = account;
112     }
113 
114     public override void Deposit(double amount)
115     {
116         Account.Balance += amount;
117         Console.WriteLine("Deposit {0} to {1},surplus of account have {2} affter deposit", amount, Account.Owner, Account.Balance);
118         Check();
119     }
120 
121     public override void Cost(double amount)
122     {
123         double newBalance = Account.Balance - amount;
124         Account.Balance -= amount;
125         Console.WriteLine("Cost {0} from {1},surplus of account have {2} affter cost", amount, Account.Owner, Account.Balance);
126         Check();
127     }
128     public override void Check()
129     {
130         if (Account.Balance > 0 && Account.Balance <= 100)
131         {
132             Account.State = new VistorState(Account);
133         }
134         else if (Account.Balance >= 1000)
135         {
136             Account.State = new VIPState(Account);
137         }
138     }
139 }
140 class VIPState : ClientState
141 {
142     public VIPState(Account account)
143     {
144         Account = account;
145     }
146 
147     public override void Deposit(double amount)
148     {
149         Account.Balance += amount;
150         Console.WriteLine("Deposit {0} to {1},surplus of account have {2} affter deposit", amount, Account.Owner, Account.Balance);
151         Check();
152     }
153 
154     public override void Cost(double amount)
155     {
156         double newBalance = Account.Balance - amount;
157         Account.Balance -= amount;
158         Console.WriteLine("Cost {0} from {1},surplus of account have {2} affter cost", amount, Account.Owner, Account.Balance);
159         Check();
160     }
161     public override void Check()
162     {
163         if (Account.Balance > 100 && Account.Balance < 1000)
164         {
165             Account.State = new MemberState(Account);
166         }
167         else if (Account.Balance > 0 && Account.Balance <= 100)
168         {
169             Account.State = new VistorState(Account);
170         }
171     }
172 }

posted @ 2015-12-31 20:55  Auth  阅读(254)  评论(0编辑  收藏  举报