Here is the UML class diagram of the design:
Class sum:
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 ten {one static void Main (string[] args) 12 {13 Account Account = new Account ("Legend", 270); Console.WriteLine ("successed!"); Console.WriteLine ("Name:{0}", account. Owner); Console.WriteLine ("Initial:{0}", account. Balance); Console.WriteLine ("------------------"); Account. Cost (250); Console.WriteLine ("-----------------------------------------"); Account. Deposit (100); Console.WriteLine ("-------------------"); Account. Deposit (200); Console.WriteLine ("-----------------------------------------"); Account. Cost (300); Console.WriteLine ("--------------------"); Account. DeposIt (999); Console.WriteLine ("-----------------------------------------"); The account. Cost (700); Console.WriteLine ("---------------------"); The account of the PNS. Cost (123); Console.WriteLine ("-----------------------------------------"); Console.ReadLine (); * * * * * * * * The class account of {ClientState state{get;set;} the public string owner{get; Set;} Balance{get;set public Account (String owner,double initialamount), {Ow Ner=owner; Balance=initialamount; State=new Vistorstate (this); Setbalance (double amount), the public void, Balance=amount, and the public V OID Deposit (double amount), {Console.WriteLine ("Now,deposit {0}.", amount), and State.deposit (AMO UNT); Console.WriteLine ("ClientState turn to {0}", state); 67} 68 public void Cost (double amount) {Console.WriteLine ("Now,cost {0}.", amount); . Cost (amount); Console.WriteLine ("ClientState turn to {0}", state); The clientstate}, the abstract class, the protected account account, and the public abstract void Deposit (dou ble amount); The public abstract void cost (double amount); Bayi public abstract void Check (); Vistorstate:clientstate (vistorstate) (account account) (Account=accoun) T The Deposit (double amount) of the public override void is account.balance+=amount; Onsole. WriteLine ("Deposit {0} to {1},surplus of the account has {2} affter Deposit", Amount, Account.owner, account.balance); 94 Check (); Amount} The public override void Cost (double) 98 {Newbalance=account.balance-amount double ; Account.balance-=amount;101 Console.WriteLine("cost {0} from {1},surplus of the account has {2} affter cost", Amount, Account.owner, account.balance); 102 Check (); 103}104 public override void Check () 106 if (account.balance>100 && account.balance< ) 107 {108 Account.state=new memberstate (account); 109}110 else if (account.balance >=1000) 111 {account.state=new Vipstate (account) 113}114}115}116 class Membersta te:clientstate117 {118 Public memberstate (account account) 119 {account=account;121}122 123 public override void Deposit (double amount) 124 {account.balance+=amount;126 Console.WriteLine ("De Posit {0} to {1},surplus of the account has {2} affter deposit ", Amount, Account.owner, account.balance); 127 Check (); }129-public override void Cost (double amount) 131 {double Newbalance=account.balance-amoun t;133 account.balance-=amount;134 Console.WriteLine ("Cost {0} from {1},surplus of the account has {2} affter cost", Amount, ACCOUNT.O Wner, account.balance) 135 check () 136}137 public override void Check () 138 {139 if (account.b Alance>0 && account.balance<=100) 141 {account.state = new vistorstate (account); 142 }143 else if (account.balance>=1000) 144 {145 account.state=new vipstate (account); 146 }147}148}149 class vipstate:clientstate150 {151 public vipstate (account account) 152 {153 account=account;154}155 156 public override void Deposit (double amount) 157 {158 Account.balance+=amo unt;159 Console.WriteLine ("Deposit {0} to {1},surplus of the account has {2} affter Deposit", Amount, Account.owner, Account.balance); 161}162 163 public override void Cost (double amount) 164 {165 Do Uble Newbalance=account.balance-amount;166 account.balance-=amount;167 Console.WriteLine ("Cost {0} ' from {1},surplus of account hav e {2} affter cost ", Amount, Account.owner, account.balance); 168 Check (); 169}170 public override void Chec K () 171 {172 if (account.balance>100 && account.balance<1000) 173 {174 Account . State=new memberstate (account); 175}176 else if (account.balance > 0 && account.balance <=10 0) 177 {178 account.state = new Vistorstate (account); 179}180}181}
Operation Result:
Advantages:
1. The conversion rules are encapsulated;
2. Convenient to add new status;
3. Allow the state transition logic to be integrated with the state object;
4. Environment objects can share state objects.
Disadvantages:
1. Complex structure and implementation;
2. The code becomes more cumbersome;
3. The OCP is not supported.
State person Mode