命令模式

Posted chester.chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了命令模式相关的知识,希望对你有一定的参考价值。

命令模式:命令模式属于对象的行为型模式。命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开。命令模式的实现可以提供命令的撤销和恢复功能。

UML图:

技术分享图片

示例代码:

    interface Command
    {
        void execute();
        void undo();
    }
    public class TextChangedCommand : Command
    {
        private TextBox ctrl;
        private String newStr;
        private String oldStr;

        public TextChangedCommand(TextBox ctrl, String newStr, String oldStr)
        {
            this.ctrl = ctrl;
            this.newStr = newStr;
            this.oldStr = oldStr;
        }

        public void execute()
        {
            this.ctrl.Text = newStr;
            this.ctrl.SelectionStart = this.ctrl.Text.Length;
        }

        public void undo()
        {
            this.ctrl.Text = oldStr;
            this.ctrl.SelectionStart = this.ctrl.Text.Length;
        }
    }
    public partial class Form1 : Form
    {
        Stack<Command> undoStack = new Stack<Command>();
        Stack<Command> redoStack = new Stack<Command>();

        string oldStr = null;
        bool flag = true;

        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (flag)
            {
                TextChangedCommand com = new TextChangedCommand((TextBox)textBox1, ((TextBox)textBox1).Text, oldStr);
                undoStack.Push(com);
                oldStr = ((TextBox)textBox1).Text;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (undoStack.Count == 0)
                return;
            flag = false;
            Command com = undoStack.Pop();
            com.undo();
            redoStack.Push(com);
            flag = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (redoStack.Count == 0)
                return;
            flag = false;
            Command com = redoStack.Pop();
            com.execute();
            undoStack.Push(com);
            flag = true;
        }
    }

 

以上是关于命令模式的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——git命令操作一个完整流程

用于从 cloudkit 检索单列的代码模式/片段

VSCode自定义代码片段——cli的终端命令大全

VSCode自定义代码片段4——cli的终端命令大全

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程