Шаблон разработки высокого уровня для инструментов редактирования изображение

Добро пожаловать в Переполнение стека.

Если ваш код зафиксирован и передан, вы почти ничего не можете сделать безопасно, так что не беспокойтесь об ошибках.

Тем не менее, в вашем конкретном случае вам не нужно делать много. Просто создайте новый каталог project-one, используя mkdir project-one. Переместите file-one и file-two в него, используя git mv file-one file-two project-one, а затем подтвердите новые изменения, используя git commit (команда git mv автоматически установит переименования)

6
задан Ed S. 5 April 2009 в 04:38
поделиться

3 ответа

Хорошо, эмпирическое правило: если Вы видите a switch оператор в Вашем эскизе кода, это - знак, необходимо использовать полиморфизм вместо этого. Так, в этом случае Вы хотите смочь перенести различные операции, и Вы желаете a switch, таким образом, необходимо думать, "как я могу сделать это чем-то с помощью полиморфизма?"

Теперь, взгляните на Шаблон "команда", где Ваши объекты являются глаголами вместо существительных. Каждая Команда реализует a doThis() метод; при построении объекта Вы устанавливаете то, что команду wil делают.

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){ // ...
   }
}

Теперь, рассмотрите то, что Вы сделали бы, если бы Вы хотели реализовать отмену?

Обновление

Хорошо, давайте расширим это немного больше. Точка использования этого шаблона должна удостовериться, что клиент не должен знать все так очень, кроме тех случаев, когда Вы делаете исходную конструкцию. Таким образом для этого примера, давайте думать о рисовании прямоугольника. Когда Вы picka инструмент Rectangle, Вы собираетесь иметь некоторый код обработчика событий нажатия кнопки (это - весь псевдокод btw),

 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)

и эти вещи сделаны. Это должно быть очевидно теперь, когда Вы реализовали бы отмену путем добавления "undoThis" метода для Управления. При создании команды необходимо создать код так, чтобы объект знал, как отменить себя. Затем отмените средства просто взятие последнего Объекта команды от списка и выполнения его undoThis метода.

1
ответ дан 17 December 2019 в 20:35
поделиться

Как насчет Вас разрабатывают Ваш интерфейс немного complexer? Позволяет начинаются с некоторым кодом, и впоследствии я объясню, как он, как предполагается, работает.

public class AbstractDrawingTool {

    private Graphics g;

    void AbstractDrawingTool( Graphics g ) {
        this.g = g;
    }

    void keyDown(KeyEvent e);
    void keyUp(KeyEvent e);
    void mouseMove(MouseEvent e);
    void mouseClick(MouseEvent e);
    void drop();
    // other stuff
}

Идея состоит в том, чтобы передать ввод данных пользователем к инструменту, когда-то пользователь начинает работать с определенной реализацией. Таким образом, Вы могли создать много различных инструментов для рисования все использование того же интерфейса. Простой PointDrawingTool, например, только реализовал бы событие щелчка мышью для размещения точки в холст. PolygonDrawingTool также реализовал бы keyUp событие так, чтобы он мог остановить проведение линий, когда определенная клавиша (т.е. клавиша выхода) была нажата.

Особый случай является методом отбрасывания. Это назвали бы, для "отбрасывания" в настоящее время выбираемого инструмента. Это произошло бы, если бы другая реализация была выбрана из панели инструментов или подобная.

Вы могли также объединить это определение с шаблоном "команда". В этом случае реализация AbstractDrawingTool была бы ответственна за создание экземпляров интерфейса Command и возможно разместила бы их в стек, после того как операция закончена (т.е. размещение точки на холсте).

1
ответ дан 17 December 2019 в 20:35
поделиться

Я столкнулся с подобной проблемой при попытке перепроектировать мое отображение SW для поддержки и GDI + и Каирских библиотек графики. Я решил его путем сокращения интерфейса рисунка до некоторых общих операций/примитивов, см. код ниже.

После этого "эффекты", которые Вы хотите потянуть, являются Командами (как Charlie, говорит). Они используют IPainter взаимодействуйте через интерфейс для рисования. Хорошая вещь об этом подходе состоит в том, что эффекты полностью отделяются от конкретного механизма рисунка как GDI +. Это прибывает удобное ко мне, так как я мог затем экспортировать свой рисунок в SVG путем переключения на Каирский механизм.

Конечно, при необходимости в некоторых дополнительных графических операциях необходимо было бы расшириться IPainter интерфейс с ним, но базовая философия остается таким же. Посмотрите больше об этом здесь: http://igorbrejc.net/development/c/welcome-to-cairo

public interface IPainter : IDisposable
{
    void BeginPainting ();
    void Clear ();
    void DrawLines (int[] coords);
    void DrawPoint (int x, int y);
    void EndPainting ();
    void PaintCurve (PaintOperation operation, int[] coords);
    void PaintPolygon (PaintOperation operation, int[] coords);
    void PaintRectangle (PaintOperation operation, int x, int y, int width, int height);
    void SetHighQualityLevel (bool highQuality);
    void SetStyle (PaintingStyle style);
}

public class PaintingStyle
{
    public PaintingStyle()
    {
    }

    public PaintingStyle(int penColor)
    {
        this.penColor = penColor;
    }

    public int PenColor
    {
        get { return penColor; }
        set { penColor = value; }
    }

    public float PenWidth
    {
        get { return penWidth; }
        set { penWidth = value; }
    }

    private int penColor;
    private float penWidth;
}

public enum PaintOperation
{
    Outline,
    Fill,
    FillAndOutline,
}
0
ответ дан 17 December 2019 в 20:35
поделиться