命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
银行取款存款例子:
把各中操作扁平化,然后自定义编辑指令进行组合。最后按顺序执行!
public class BankAccount
{
private int balance;
private int overdraft = -500;
///
/// 存款
///
///
public void Remittance(int amount)
{
if (amount < 0) throw new ArgumentException("汇款金额错误");
balance += amount;
}
///
/// 取款
///
///
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()
{
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);
}
}
结果: