命令模式

来源:互联网 发布:在淘宝里怎么买东西 编辑:程序博客网 时间:2024/06/13 19:36

1.命令控制

namespace CommandPattern
{
    /*命令模式:当有客户端发送了一系列的命令或请求,去要求某个对象实现什么操作,
     * 可使用命令模式,相当于多个命令发给一个对象。
     *
     * 这一点和观察者模式非常的类似。观察者模式也是某个对象,发出消息,然后由中
     * 间对象通知观察者然后去做什么,封装的是要执行操作的对象。
     * 而命令模式,则是将各个操作封装成类,然后告知某个对象该做什么。
     *
     * 两者的区别是封装的角度不同,但有异曲同工之妙
     */
    public abstract class Command
    {
        protected Student student;

        public Command(Student studentObj)
        {
            student = studentObj;
        }

        public abstract void ExecuteCommand();
    }

    /// <summary>
    /// 做语文作业类
    /// </summary>
    class YuWen : Command
    {
        public YuWen(Student studentObj)
            : base(studentObj)
        { }

        public override void ExecuteCommand()
        {
            student.DoYuWen();
        }
    }

    /// <summary>
    /// 做数学作业
    /// </summary>
    class ShuXue : Command
    {
        public ShuXue(Student studentObj)
            : base(studentObj)
        { }

        public override void ExecuteCommand()
        {
            student.DoShuXue();
        }
    }

    /// <summary>
    /// 命令的具体实施者
    /// </summary>
    public class Student
    {
        public void DoYuWen()
        {
            Console.WriteLine("做语文作业");
        }

        public void DoShuXue()
        {
            Console.WriteLine("做数学作业");
        }
    }

    /// <summary>
    /// 命令的发布者
    /// </summary>
    public class Teacher
    {
        protected List<Command> list = new List<Command>();

        /// <summary>
        /// 安排作业
        /// </summary>
        /// <param name="comm"></param>
        public void Arrange(Command comm)
        {
            if (comm.ToString() != "CommandPattern.ShuXue")
                list.Add(comm);
        }

        /// <summary>
        /// 要求实施
        /// </summary>
        public void Release()
        {
            foreach (var com in list)
                com.ExecuteCommand();
        }
    }
}

2.调用

       static void Main(string[] args)
        {
            //实例化学生对象
            Student stu = new Student();//命令执行者
            Command com1 = new YuWen(stu);
            Command com2 = new ShuXue(stu);
            Command com3 = new YuWen(stu);
           
            Teacher tech = new Teacher();//设置作业
            tech.Arrange(com1);
            tech.Arrange(com2);
            tech.Arrange(com3);
            tech.Release();

            Console.ReadKey();
        }