首页 > 其他分享 >命令模式

命令模式

时间:2022-08-16 20:23:36浏览次数:44  
标签:Text void 模式 命令 document public UndoableCommand textbox

命令模式

使用命令模式,对于undo机制。

封装一个请求作为一个对象,让你参数化客户端,对于不同的请求,队列或者日志请求,并且支持可撤销操作。

这个模式最大的优势就是,它解耦了调用操作的对象,从一个如何知道它如何执行的对象。

开发一个简单的Notepad克隆。

第一步,我们想去创建一个抽象,围绕我们的textbox控件。在命令模式,这个抽象叫做接收者。
接收者在我们的例子中是一个对象,叫做Document。

class Document
{
	private TextBox textbox;
	
	public Document(TextBox textbox)
	{
		this.textbox = textbox;
	}
	
	public void BoldSelection()
	{
		Text = String.Format("<b>{0}<b>", Text);
	}
	
	    public void UnderlineSelection()
    {
        Text = String.Format("<u>{0}</u>", Text);
    }

    public void ItalicizeSelection()
    {
        Text = String.Format("<i>{0}</i>", Text);
    }

    public void Cut()
    {
        textbox.Cut();
    }

    public void Copy()
    {
        textbox.Copy();
    }

    public void Paste()
    {
        textbox.Paste();
    }

    public string Text
    {
        get { return textbox.Text; }
        set { textbox.Text = value; }
    }
}

黑体选择,下划线选择,斜体(Italicize)选择。

我们已经定义于Document对象的,是一些操作,可以于document执行,完整地解耦这个功能从我么的应用。
如果我们想要改变加粗选定内容时所发生的情况,我们会转到这个对象,而不是转到表示代码。

第二步,我们将需要去设计我们的命令接口。自从可能,我们有一些命令不需要undo机制(例如,Copy),我们已经创建两个基类(Command和UndoableCommand)。我们将在本文的后面看一下UndoableCommand是如何连接的。目前,只要记住,这是一个类,去派生,如果你需要你的命令能够undo它自己。

public abstract class Command
{
    public abstract void Execute();
}

public abstract class UndoableCommand : Command
{
    public abstract void Undo();
}

为了处理粗体,我们将创建如下的代码:

class BoldCommand : UndoableCommand
{
    private Document document;
    private string previousText;
    public BoldCommand(Document doc)
    {
        this.document = doc;
        previousText = this.document.Text;
    }

    public override void Execute()
    {
        document.BoldSelection();
    }

    public override void Undo()
    {
        document.Text = previousText;
    }
}

通过创建一个document对象,包裹文本盒子,我们能够完整地解耦对象,它将调用操作(一个菜单项)从一个如何知道执行(document object)解耦。

剩下的命令对象非常类似于上面。

剩下的代码,我们将需要去带来所有的事物在一起,是一个CommandManager。CommandManager是一个非常简单的类,
它有一个内部的栈,持续追踪我们的命令对于我们的undo机制。

class CommandManager
{
    private Stack commandStack = new Stack();

    public void ExecuteCommand(Command cmd)
    {
        cmd.Execute();
        if (cmd is UndoableCommand)
        {
            commandStack.Push(cmd);
        }
    }


    public void Undo()
    {
        if (commandStack.Count > 0)
        {
            UndoableCommand cmd = (UndoableCommand)commandStack.Pop();
            cmd.Undo();
        }
    }
} 

我们看上面的代码,我们只需要去添加命令到undo栈,如果它是一个UndoableCommand。

标签:Text,void,模式,命令,document,public,UndoableCommand,textbox
From: https://www.cnblogs.com/pixel-Teee/p/16592836.html

相关文章

  • 设计模式学习(3)生成实例
    单例模式这个太简单了,贴一下代码吧publicclassSingleton{privatestaticSingletonsingleton=newSingleton();publicstaticSingletongetInstance(){......
  • podman无根模式
    目录podman无根模式卷podman无根模式在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置cgroupV2Linux内核功能允许用户限制普通用户......
  • Redis---客户端命令
    1.前言Redis提供了一些操作客户端(client)的命令,比如查询所有已连接到服务器的客户端数量,控制客户端的连接状态(关闭或者挂起)等。通过客户命令我们可以轻松的实现对客户端的......
  • top命令常用方法
    https://feichen.blog.csdn.net/article/details/104562895?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommend......
  • DOS命令
    DOS命令DOS:diskoperatesystem,磁盘操作系统,DOS命令又分内部命令和外部命令。内部命令又称为驻机命令,它是随着DOS系统的启动同时被加载到内存里且长驻内存。也就是说,只......
  • computed的原始模式 : get 和 set
    //完整的写法:fullname:{get:function(){returnthis.firstname+""+this.lastname},set:fun......
  • Linux--cheat命令详解
    今天给大家介绍一个Linux超级实用命令,有了这个命令,你就可以愉快使用Linux上几乎所有常用命令了,再也不用担心记不住那么多选项啦~我们知道,Linux系统总共有300~500个......
  • java-代码操作服务器之SSH连续发送命令
    java操作Linux服务器可以使用专用的jar包,这里介绍使用jsch操作Linux服务器maven依赖<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactI......
  • 项目中,需要对设备上线离线的动作做日志打印. (利用redis发布订阅监听key解决. 观
    https://blog.csdn.net/weixin_44642403/article/details/116278262?ops_request_misc=&request_id=&biz_id=102&utm_term=redis%E7%9B%91%E5%90%ACkey%E5%9C%A8%E4%BB%80%......
  • linux 命令查看内存和cpu信息
    linux命令查看内存和cpu信息1、查看CPU信息命令cat/proc/cpuinfo2、使用top命令查看CPU的使用情况top3、free命令查看内存free4、df(diskfree):显示磁盘分区上......