Как я могу решить эту проблему с классами C #? - PullRequest
1 голос
/ 06 июня 2011

Я создаю приложение, в котором пользователь сможет настроить ряд функций для запуска на объекте (средства обработки изображений).

Каждая отдельная функция не имеет ни настраиваемых параметров, ни своих уникальныхнабор параметров.

Это сложно объяснить, поэтому позвольте мне показать простой пример:

  1. Изображение открыто (всегда происходит)
  2. Удалить границу (два варианта)
  3. Изображение Despeckle (5 вариантов)
  4. Изображение кадрирования (10 вариантов)
  5. Сохранить изображение

Проблема в том, что мне нужно разрешитьпользователь может создать собственную серию функций очистки, которые будут использоваться для массовой обработки изображений.

Как лучше всего это сделать?

Ответы [ 2 ]

6 голосов
/ 06 июня 2011

Я настоятельно рекомендую вам взглянуть на шаблон команды:

По сути, это включает создание подклассов «Команда» для каждого типа действияпользователь может выполнять - и помещать их в стек после выполнения команды.

Каждая команда знает, как «делать» себя, а также «отменять» себя.

Таким образом, отмена - это относительно простой процесс извлечения команд из стека и вызова для них метода отмены.

Поскольку каждый экземпляр Команды может содержать свое собственное состояние («параметры»), вы можете заранее создать именно те команды, которые хотите использовать, и «пакетировать» их, чтобы получить искомый результат.,

псевдокод:

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

Если вы действительно хотите, вы можете сделать его немного более сложным и сделать всеСериализуемые определения команд - позволяют создавать их список, читать их и выполнять позже.

5 голосов
/ 06 июня 2011

Это можно решить с помощью одного из стандартных шаблонов проектирования «Банды четырех». Вам следует потратить немного времени на чтение Command Pattern . Этот шаблон позволяет вам инкапсулировать операции, выполняемые над объектом, в классах, которые реализуют один и тот же интерфейс. В вашем примере каждый ваш шаг становится командой. Если у вас есть общий интерфейс для ваших команд, вы можете затем объединить их в макросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...