Как реализовать цепочку ответственности с помощью Java Swing

У меня есть задача создать простое приложение для рисования, в котором можно рисовать основные фигуры (овалы, линии, прямоугольники) с выбранными цветами границы и заливки, используя Java Swing и MVC.

Часть формы модели реализована с использованием составного шаблона. Реализуемая функциональность — это рисование (это уже обрабатывается самими классами фигур), изменение размера, перемещение и удаление фигур, и я должен использовать шаблон цепочки ответственности (CoR) для выполнения этого.

CoR имеет смысл для меня в теории, но мне трудно понять, как я могу применить его для реализации функциональности на практике. Я понимаю, что когда я нажимаю на панель рисования, программа должна распознавать, какая фигура выбрана, и тогда я могу реализовать методы изменения размера, перемещения, удаления.

Итак, мне нужен совет:

1) как здесь практически реализовать паттерн CoR?

2) как лучше реализовать функционал по изменению размера, перемещению, удалению? В собственных конкретных классах обработчиков, как методы в классах форм, другие?

Большое спасибо за помощь.


person J.Dow    schedule 17.12.2019    source источник
comment
Вы уверены, что вам не нужны (абстрактные) фабрики или любой шаблон создания, подходящий для создания объектов? Цепочка ответственности — это поведенческий паттерн, хорошим вариантом использования может быть банкомат.   -  person Nikolas Charalambidis    schedule 17.12.2019
comment
Я согласен, что имело бы смысл использовать фабрику, но для задания мне было указано использовать паттерн Composite для модельной части.   -  person J.Dow    schedule 17.12.2019
comment
Я не уверен насчет CoR, но некоторые связанные примеры приведены здесь; GraphPanel самый простой.   -  person trashgod    schedule 18.12.2019


Ответы (1)


Вот предлагаемая базовая реализация CoR.
Для простоты использования следующий код представляет собой однофайловый mre : весь код можно скопировать -вставил в ShapeManipulator.java и запустил:

public class ShapeManipulator {

    public static void main(String[] args) {
        Shape s1 = new Shape();
        Shape s2 = new Shape();
        Shape s3 = new Shape();

        ShapeManipulationBase move = new MoveHandler();
        ShapeManipulationBase resize = new ResizeHandler();
        ShapeManipulationBase delete = new DeleteHandler();

        move.setXparam(50).setYparam(25).handle(s1);
        resize.setXparam(100).setYparam(250).handle(s1);
        resize.setXparam(200).setYparam(20).handle(s2);
        delete.handle(s3);
    }
}

//CoR basic interface 
interface ShapeManipulationHandler {
     void handle(Shape shape);
}

//base class allows swtting of optional x, y parameters 
abstract class ShapeManipulationBase implements ShapeManipulationHandler {

    protected int Xparam, Yparam; 

    //setters return this to allow chaining of setters 
    ShapeManipulationBase setXparam(int xparam) {
        Xparam = xparam;
        return this;
    }

    ShapeManipulationBase setYparam(int yparam) {
        Yparam = yparam;
        return this;
    }

    @Override
    public abstract void handle(Shape shape) ;
}

class MoveHandler extends ShapeManipulationBase {

    @Override
    public void handle(Shape shape) {
        System.out.println("Moving "+ shape + " by X="+ Xparam + " and Y="+ Yparam);
    }
}

class ResizeHandler extends ShapeManipulationBase {

    @Override
    public void handle(Shape shape) {
        System.out.println("Resizing "+ shape + " by X="+ Xparam + " and Y="+ Yparam);
    }
}

class DeleteHandler extends ShapeManipulationBase {

    @Override
    public void handle(Shape shape) {
        System.out.println("Deleting "+ shape);
    }
}

class Shape{
    private static int shapeCouner = 0;
    private final int shapeNumber;

    Shape() {
        shapeNumber = ++shapeCouner;
    }

    @Override
    public String toString() {
        return "Shape # "+shapeNumber;
    }
}
person c0der    schedule 18.12.2019
comment
Спасибо, это выглядит полезным, я постараюсь реализовать соответствующим образом. - person J.Dow; 18.12.2019
comment
В этом ответе нет ничего похожего на шаблон проектирования цепочки ответственности. - person jaco0646; 22.03.2020