zoukankan      html  css  js  c++  java
  • 结合项目实例 回顾传统设计模式(六)命令模式

    命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。用户程序在使用的时候,只与该命令对象打交道,而不用与一类对象打交道,降低了耦合性,提高了程序设计的灵活性。

    我们还是那数据库操作为例

      public class DBInstance
        {
            public void ExecuteNonQuery()
            {
            }

            public void ExecuteDataset()
            {
            }
           
        }
        public class SqlInstance : DBInstance
        {
            public void ExecuteNonQuery()
            {
                Console.WriteLine("this is a SqlInstance");
            }
        }
        public class OracleInstance : DBInstance
        {
            public void ExecuteNonQuery()
            {
                Console.WriteLine("this is a OracleInstance");
            }
        }
    public interface Command
        {
            void execute();
        }

        public class SqlCommand : Command
        {
            SqlInstance sqlinstance;
            public SqlCommand(SqlInstance sqlins)
            {
                this.sqlinstance = sqlins;
            }
            public void execute()
            {
                sqlinstance.ExecuteNonQuery();
            }
        }

        public class OracleCommand : Command
        {
            OracleInstance Oracleinstance;
            public OracleCommand(OracleInstance Oracleins)
            {
                this.Oracleinstance = Oracleins;
            }
            public void execute()
            {
                Oracleinstance.ExecuteNonQuery();
            }
        }

        public class DBControl
        {
            Command[] commands;
            public DBControl()
            {
                commands = new Command[2];
            }
            public void setCommand(int index,Command comm)
            {
                commands[index] = comm;
            }
            public void control(int index)
            {
                commands[index].execute();
            }
        }

    测试下命令模式

     DBControl dc = new DBControl();
                SqlInstance si = new SqlInstance();
                SqlCommand sc = new SqlCommand(si);
                OracleInstance oi = new OracleInstance();
                OracleCommand oc = new OracleCommand(oi);

                dc.setCommand(0, sc);
                dc.setCommand(1, oc);

                dc.control(0);
                dc.control(1);

    总结:有的同学可能会问接收者有必要存在吗?为何命令对象不知想实现execute()方法的细节。一般来说,我们设计命令对象,它或许只需要调用一个接收者的一个行为。然而有许多命令对象会实现许多逻辑,直接完成一个请求。当然你可以设计更全面的命令对象,只是这样一来,调用者和接收者之间的解耦程度会再度降低。实际项目中命令可以将运算快打包(一个接收者一组动作),然后将他们传来传去,就像是普通对象一样。所以在日程安排、线程池、事务队列中命令模式的使用也是比较广泛的,

    原创作品允许转载,转载时请务必以超链接形式标明文章原始出处以及作者信息。
    作者:熬夜的虫子
    点击查看:博文索引
  • 相关阅读:
    支持nmap批量漏洞扫描的script
    Linux学习路径(小白必看)
    SEED实验系列:Collabtive系统SQL注入实验
    SEED实验系列:ShellShock 攻击实验
    SEED信息安全实验系列:缓冲区溢出漏洞实验
    SEED实验系列:缓冲区溢出漏洞试验
    信息安全不可错过的30门实验
    SEED实验系列文章目录
    Laravel大型项目系列教程(七)之7 扩展包和Artisan开发
    laravel大型项目系列教程(六)之优化、单元测试以及部署
  • 原文地址:https://www.cnblogs.com/dubing/p/2199385.html
Copyright © 2011-2022 走看看