设计模式-我如何用C#类来解决这个问题

本文关键字:解决 问题 何用 设计模式 | 更新日期: 2023-09-27 17:58:30

我正在创建一个应用程序,用户将能够设置一系列在对象上运行的函数(图像处理之类的东西)。

每个不同的函数要么没有可配置的选项,要么有自己的选项集。

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

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

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

对此,最好的方法是什么?

设计模式-我如何用C#类来解决这个问题

我强烈建议您研究命令模式:

  • http://www.codeproject.com/KB/architecture/Command_Pattern.aspx

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

每个命令都知道如何"执行"自己,也知道如何"撤消"自己。

因此,undo是一个相对直接的过程,从堆栈中弹出命令,并对其调用undo方法。

因为命令的每个实例都可以包含自己的状态("选项"),所以您可以提前准确地创建要使用的命令,并"批处理"它们以获得所需的结果。

伪代码:

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 });
...

如果您真的愿意,您可以让它更加复杂,并使所有的命令定义都可以序列化——允许您创建它们的列表,并在列表中读取并稍后执行它们。

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