Ищу пример шаблона команды для пользовательского интерфейса [закрыто]
-
08-06-2019 - |
Вопрос
Я работаю над WinForm.Сетевое приложение с базовым пользовательским интерфейсом, которое включает кнопки панели инструментов, пункты меню и нажатия клавиш, которые запускают один и тот же базовый код.Прямо сейчас обработчики событий для каждого из них вызывают общий метод для выполнения функции.
Из того, что я прочитал, следует, что этот тип действий может быть обработан Шаблон проектирования команд с дополнительным преимуществом автоматического включения / отключения или проверки / снятия флажков с элементов пользовательского интерфейса.
Я искал в сети хороший пример проекта, но на самом деле так его и не нашел.У кого-нибудь есть хороший пример, которым можно поделиться?
Решение
Давайте сначала убедимся, что мы знаем, что это за командный шаблон:
Шаблон команды инкапсулирует запрос в виде объекта и предоставляет ему известный общедоступный интерфейс.Шаблон команд гарантирует, что каждый объект получает свои собственные команды и обеспечивает развязку между отправителем и получателем.Отправитель - это объект, который вызывает операцию, а получатель - это объект , который получает запрос и действует в соответствии с ним.
Вот вам пример.Есть много способов, которыми вы можете это сделать, но я собираюсь использовать подход на основе интерфейса, чтобы сделать код более тестируемым для вас.Я не уверен, какой язык вы предпочитаете, но я пишу это на C #.
Сначала создайте интерфейс, описывающий Команду.
public interface ICommand
{
void Execute();
}
Во-вторых, создайте командные объекты, которые будут реализовывать командный интерфейс.
public class CutCommand : ICommand
{
public void Execute()
{
// Put code you like to execute when the CutCommand.Execute method is called.
}
}
В-третьих, нам нужно настроить наш объект invoker или sender.
public class TextOperations
{
public void Invoke(ICommand command)
{
command.Execute();
}
}
В-четвертых, создайте объект client, который будет использовать объект invoker / sender.
public class Client
{
static void Main()
{
TextOperations textOperations = new TextOperations();
textOperation.Invoke(new CutCommand());
}
}
Я надеюсь, что вы сможете взять этот пример и использовать его в приложении, над которым вы работаете.Если вы хотите получить дополнительные разъяснения, просто дайте мне знать.
Другие советы
Вы на правильном пути.По сути, у вас будет модель, представляющая документ.Вы будете использовать эту модель в команде CutCommand.Вам нужно будет изменить конструктор CutCommand, чтобы он принимал информацию, которую вы хотите вырезать.Затем каждый раз, скажем, при нажатии кнопки Вырезать, вы вызываете новую команду CutCommand и передаете аргументы в конструктор.Затем используйте эти аргументы в классе при вызове метода Execute.
Попробуйте редакторы .NET с открытым исходным кодом, такие как Резкое развитие или Блокнот++.
Существует (естественно) некоторое обсуждение шаблона команды на http://c2.com/cgi/wiki ?Командный шаблон это могло бы быть полезно.
Qt использует шаблон команд для элементов меню / панели инструментов.
QActions создаются отдельно из QMenuItem и QToolBar, и Действия могут быть назначены QMenuItem и QToolBar с помощью методов setAction() и addAction() соответственно.
http://web.archive.org/web/20100801023349/http://cartan.cas.suffolk.edu/oopdocbook/html/menus.html
http://web.archive.org/web/20100729211835/http://cartan.cas.suffolk.edu/oopdocbook/html/actions.html
Я не могу помочь вам с примером ссылки, но могу привести пример сам.
1) Определите интерфейс ICommand:
public interface ICommand {
void Do();
void Undo();
}
2) Создайте свои реализации ICommand для конкретных команд, но также определите для них абстрактный базовый класс:
public abstract class WinFormCommand : ICommand {
}
3) Создайте средство вызова команды:
public interface ICommandInvoker {
void Invoke(ICommand command);
void ReDo();
void UnDo();
}
public interface ICommandDirector {
void Enable(ICommand);
void Disable(ICommand);
}
public class WinFormsCommandInvoker : ICommandInvoker, ICommandDirector {
private readonly Dictionary<ICommand, bool> _commands;
private readonly Queue<ICommand> _commandsQueue;
private readonly IButtonDirector _buttonDirector;
// you can define additional queue for support of ReDo operation
public WinFormsCommandInvoker(ICommandsBuilder builder, IButtonDirector buttonDirector) {
_commands = builder.Build();
_buttonDirector = buttonDirector;
_commandsQueue = new Queue<ICommand>();
}
public void Invoke(ICommand command) {
command.Do();
__commandsQueue.Enqueue(command);
}
public void ReDo() {
//you can implement this using additional queue
}
public void UnDo() {
var command = __commandsQueue.Dequeue();
command.Undo();
}
public void Enable(ICommand command) {
_commands.[command] = true;
_buttonDirector.Enable(command);
}
public void Disable(ICommand command) {
_commands.[command] = false;
_buttonDirector.Disable(command);
}
}
4) Теперь вы можете реализовать свой ICommandsBuilder, IButtonDirector и добавить другие интерфейсы, такие как ICheckBoxDirector, в WinFormsCommandInvoker.