• 结合项目实例 回顾传统设计模式(六)命令模式


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

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

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

    原创作品允许转载,转载时请务必以超链接形式标明文章原始出处以及作者信息。
    作者:熬夜的虫子
    点击查看:博文索引
  • 相关阅读:
    QLPreviewController来预览文件
    Camera360SDK
    实现 JSON + Jquery+.Net ajax功能
    showModalDialog传值
    web方式AJAX调用
    CRM4.0多个实体关联查询
    用javascript 动态添加部门和人员
    GridView中使用超连接
    根据订单号查询出订单附属实体
    sql 常用聚合函数
  • 原文地址:https://www.cnblogs.com/dubing/p/2199385.html
Copyright © 2020-2023  润新知