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

本文通过数据库操作实例详细介绍了命令模式的概念及应用。通过将请求封装为对象,实现了不同请求的参数化,增强了系统的灵活性和可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

转载于:https://www.cnblogs.com/dubing/archive/2011/10/05/2199385.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值