命令模式 回滚

 

    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 interface ICommand
    {
        void Call();
        void Undo();
    }
    public class BankCommand:ICommand
    {
        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;
            }
        }

        public void Undo()
        {
            switch (opType)
            {
                case OpType.存款:
                    bankAccount.Withdrawal(amount);
                    Console.WriteLine($"{DateTime.Now}:存款取消 {amount} 余额:{bankAccount}");
                    break;
                case OpType.取款:
                    bankAccount.Remittance(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);
            foreach (var item in Enumerable.Reverse(commands))
            {
                item.Undo();
            }
            Console.WriteLine(bank);
        }
    }

 

posted @ 2022-05-26 10:54  后跳  阅读(32)  评论(0编辑  收藏  举报