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

    原创作品允许转载,转载时请务必以超链接形式标明文章原始出处以及作者信息。
    作者:熬夜的虫子
    点击查看:博文索引
  • 相关阅读:
    Linux之文件处理命令
    Linux基础命令
    rip实验
    Linux基础之磁盘分区
    mysql安装
    centos Apache、php、mysql默认安装路径
    You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
    Wrong permissions on configuration file, should not be world writable!
    机器会学习么 学习总结
    实验 5 Spark SQL 编程初级实践
  • 原文地址:https://www.cnblogs.com/dubing/p/2199385.html
Copyright © 2011-2022 走看看