• 命令模式


    命令模式(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); 
    
            }
        }

    结果:

  • 相关阅读:
    HTTP的传输编码(Transfer-Encoding:chunked)
    单向链表寻找入环点算法的证明
    Java容器解析系列(17) LruCache详解
    Java容器解析系列(16) android内存优化之SparseArray
    Java容器解析系列(15) HashTable Dictionary & Properties
    Java容器解析系列(14) IdentityHashMap详解
    Swift开发之iOS11下UIToolBar非正常显示问题
    Python爬虫之Scrapy框架爬取XXXFM音频文件
    ARKit文档翻译之ARTrackable协议
    ARKit文档翻译之ARAnchor类
  • 原文地址:https://www.cnblogs.com/Zingu/p/16312204.html
Copyright © 2020-2023  润新知