命令模式
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
银行取款存款例子:
把各中操作扁平化,然后自定义编辑指令进行组合。最后按顺序执行!
public class BankAccount { private int balance; private int overdraft = -500; /// <summary> /// 存款 /// </summary> /// <param name="amount"></param> public void Remittance(int amount) { if (amount < 0) throw new ArgumentException("汇款金额错误"); balance += amount; } /// <summary> /// 取款 /// </summary> /// <param name="amount"></param> public void Withdrawal(int amount) { if (amount < 0) throw new ArgumentException("汇款金额错误"); if (balance-amount<overdraft) { throw new ArgumentException("余额不足!"); } balance -= amount; } public override string ToString() { return $"balance:{balance}"; } } public class BankCommand { public enum OpType { 存款, 取款 } private BankAccount bankAccount; private OpType opType; private int amount; public BankCommand(BankAccount bankAccount, OpType opType, int amount) { this.bankAccount = bankAccount; this.opType = opType; this.amount = amount; } public void Call() { switch (opType) { case OpType.存款: bankAccount.Remittance(amount); Console.WriteLine($"{DateTime.Now}:存款 {amount} 余额:{bankAccount}"); break; case OpType.取款: bankAccount.Withdrawal(amount); Console.WriteLine($"{DateTime.Now}:取款 {amount} 余额:{bankAccount}"); break; default: break; } } } class Program { static void Main(string[] args) { BankAccount bank = new BankAccount(); var commands = new List<BankCommand>() { new BankCommand(bank, BankCommand.OpType.存款,600), new BankCommand(bank, BankCommand.OpType.取款,300), new BankCommand(bank, BankCommand.OpType.存款,500), }; commands.ForEach(c => c.Call()); Console.WriteLine(bank); } }
结果: