设计模式-我如何用C#类来解决这个问题
本文关键字:解决 问题 何用 设计模式 | 更新日期: 2023-09-27 17:58:30
我正在创建一个应用程序,用户将能够设置一系列在对象上运行的函数(图像处理之类的东西)。
每个不同的函数要么没有可配置的选项,要么有自己的选项集。
这很难解释,所以让我举一个简单的例子:
- 图像打开(总是发生)
- 删除边框(两个选项)
- Despeckle图像(5个选项)
- 裁剪图像(10个选项)
- 保存图像
问题是,我需要允许用户创建一系列自定义的清理函数,这些函数将用于批量处理图像。
对此,最好的方法是什么?
我强烈建议您研究命令模式:
- 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 });
...
如果您真的愿意,您可以让它更加复杂,并使所有的命令定义都可以序列化——允许您创建它们的列表,并在列表中读取并稍后执行它们。
这可以通过一个标准的"四人帮"设计模式来解决。您应该花一些时间阅读有关命令模式的内容。此模式允许您将对对象执行的操作封装在实现相同接口的类中。在您的示例中,您的每一个步骤都将成为一个命令。一旦有了命令的通用界面,就可以将它们组合成宏。