Хорошо, эмпирическое правило: если вы видите оператор switch
в наброске кода, это признак того, что вам нужно вместо этого использовать полиморфизм. Итак, в этом случае вы хотите иметь возможность выполнять различные операции, и вы обнаружите, что хотите получить switch
, поэтому вам следует подумать: «Как я могу сделать это с помощью полиморфизма?»
Теперь взгляните на шаблон Command, где ваши объекты: глаголы вместо существительные . Каждая команда реализует метод doThis()
; когда вы создаете объект, вы устанавливаете, что будет делать команда.
public interface Command {
public void doThis(Graphics g); // I don't promise returning
// void is the best choice
// Would it be better to return a Graphics object?
}
public class DrawRectangle implements Command {
public DrawRectagle( Point topLeft, Point btmRight) { // ...
}
public void doThis(Graphics g){ // ...
}
}
Теперь подумайте, что бы вы сделали, если бы хотели реализовать отменить ?
Обновление
Хорошо, давайте расширим это немного подробнее. Смысл использования этого шаблона - убедиться, что клиенту не нужно знать все, кроме случаев, когда вы делаете первоначальную конструкцию. Итак, для этого примера давайте подумаем о рисовании прямоугольника. Когда вы выберете инструмент Rectangle, у вас будет какой-то код в обработчике события нажатия кнопки (это все псевдокод между прочим)
cmdlist = [] // empty list
bool firstClick = true
Point tl = br = new Point(0,0)
onClick:
if firstClick:
get mouse position into tl
firstClick = false
else:
get mouse position into br
cmdlist.append(new DrawRectangle(tl, br))
firstClick = true
Итак, теперь, когда вы выбрали прямоугольник, вы добавляете объект DrawRectangle в структуру списка команд. Через некоторое время вы пробегаете список
for cmd in cmdlist:
cmd.doThis(Graphics g)
и все это сделано. Теперь должно быть очевидно, что вы бы реализовали отмену, добавив метод «отменить» в Command. Когда вы создаете команду, вы должны построить код, чтобы объект знал, как отменить себя. Тогда отменить означает просто удалить последний объект Command из списка и выполнить его метод undoThis.