Как определить наиболее подходящий шаблон проектирования для сценария - PullRequest
0 голосов
/ 17 марта 2020

Я хочу реализовать программу рисования на основе GUI. Он должен уметь рисовать круги, треугольники и квадраты. И это должно быть в состоянии расширить число фигур в системе в будущем.

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

Я хочу использовать шаблон проектирования для этой программы, и так как методы будут отличаться от формы к форме Я думаю, что шаблон стратегии будет полезен.

Я хочу знать, как хорошо я использовал этот шаблон.

interface Shape{}

interface Behavioral{
public void move(Graphics g){}
public void expand(Graphics g){}
public void draw(Graphics g){}
}

(There is an aggregation between shape and behavioral)

interface Rotatable{
public void rotate(Graphics g)
} 

interface RotatableToLeft extends Rotatable(){
public void rotate(Graphics g)
}

interface RotatableToRight extends Rotatable(){
public void rotate(Graphics g)
}

class circle implements Shape{
public void move(Shape g){--}
public void expand(Shape g){--}
public void draw(Shape g){--}

}

class Square implements Shape implements Rotatable{
public void move(Shape g){--}
public void expand(Shape g){--}
public void draw(Shape g){--}
public void rotatefree(RotatableToLeft g){--}
}

class Triangle implements Shape implements Rotatable{
public void move(Graphics g){--}
public void expand(Graphics g){--}
public void draw(Graphics g){--}
public void rotateLeft(RotatableToLeft g){--}
public void rotateRight(RotatableToRight g){--}

}

1 Ответ

1 голос
/ 17 марта 2020

Shape, вероятно, должен быть общим абстрактным базовым классом, а не интерфейсом, и, по крайней мере, draw() должен быть членом Shape. И поскольку каждая фигура, вероятно, должна реализовывать все другие методы Behavioral, вы можете избавиться от Behavioral и переместить все ее методы в Shape.

RotatableToLeft, а RotatableToRight не иметь смысл. Используйте только один интерфейс, содержащий только один метод, и передайте направление вращения.

Возможно, вам понадобится несколько методов tryAs и is и as. Например:

class Shape
{
    public Rotatable tryAsRotatable() { return null; }

    public final boolean isRotatable()
    {
        return tryAsRotatable() != null;
    }

    public final Rotatable asRotatable() 
    {
        Rotatable result = tryAsRotatable();
        assert result != null;
        return result;
    }
}

class Circle extends Shape implements Rotatable
{
    @Override
    public Circle tryAsRotatable() { return this; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...