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 }