繁体   English   中英

如何使用 C# 类解决此问题?

[英]How can I solve this problem with C# classes?

我正在创建一个应用程序,用户将能够设置一系列功能以在 object(图像处理材料)上运行。

每个不同的 function 要么没有可配置的选项,要么没有自己独特的选项集。

这很难解释,所以让我举一个简单的例子:

  1. 图像打开(总是发生)
  2. 移除边框(两个选项)
  3. 去斑图像(5 个选项)
  4. 裁剪图像(10 个选项)
  5. 保存图片

问题是我需要允许用户创建一系列自定义清理函数,用于批量处理图像。

go 关于这个的最佳方法是什么?

我强烈建议您查看命令模式:

从本质上讲,这涉及为用户可以执行的每种类型的操作创建“命令”子类 - 并在命令执行后将它们推送到堆栈。

每个命令都知道如何“做”自己,也知道如何“撤消”自己。

因此,撤消是将命令从堆栈中弹出并调用它们的撤消方法的相对直接的过程。

因为命令的每个实例都可以包含它自己的 state(“选项”),所以您可以提前准确地创建您想要使用的命令,并“批量”它们以获得您正在寻找的结果。

伪代码:

public class ImageEditor
{
     public Stack<Command> undoList = new Stack<Command>();
     public void executeCommand(Command command)
     {
           command.performAction(this);
           undoList.push(command);
     }
     public void undo()
     {
           undoList.peek().undoAction(this);
           undoList.pop();
     }
}

public interface ICommand
{
     void performAction(ImageEditor editor);
     void undoAction(ImageEditor editor);
}

public class CreateBorderCommand : ICommand
{
     public int BorderWidth { get; set; }

     private Border MyBorderBox { get; set; }

     public void performAction(ImageEditor editor)
     {
           MyBorderBox = new Border(BorderWidth, editor.frame);
           editor.addElement(MyBorderBox);
     }
     public void undoAction(ImageEditor editor)
     {
           editor.removeElement(MyBorderBox);     
     }
}

稍后的:

ImageEditor editor = new ImageEditor();
editor.executeCommand(new CreateBorderCommand() { BorderWidth = 10 });
...

如果你真的想要,你可以让它更复杂一些,并使所有的命令定义可序列化 - 允许你创建它们的列表并在列表中读取并稍后执行它们。

这可以通过标准的“四人组”设计模式之一来解决。 您应该花一些时间阅读有关命令模式的信息。 此模式允许您将在 object 上执行的操作封装在实现相同接口的类中。 在您的示例中,您的每个步骤都成为一个命令。 一旦你有一个通用的命令接口,你就可以将它们组合成宏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM