Cómo identificar el patrón de diseño más adecuado para un escenario

Entretenimiento:

Quiero poner en práctica un programa de dibujo basado en una interfaz. Debe ser capaz de dibujar círculos, triángulos y cuadrados. Y debe ser capaz de ampliar el número de formas en el sistema en el futuro.

El programa dará ciertas habilidades '' a estas formas, tales como la capacidad de 'movimiento', 'ampliar', 'rotación' y por supuesto 'draw' (para obtener la forma dibujada en la interfaz gráfica de usuario). Cada uno de estos métodos necesita un 'Contexto Gráfico' se pasa como un parámetro, con el fin de conseguir que se dibujan.

Quiero utilizar un patrón de diseño para este programa y ya que habrá métodos difieren de una forma a otra Creo patrón de estrategia será útil.

Quiero saber la forma en la que he utilizado este patrón está bien.

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

}
Mike Nakis:

Shapeprobablemente debería ser una clase base abstracta común, no una interfaz, y por lo menos, draw()debe ser un miembro de Shape. Y puesto que cada forma es, probablemente, para poner en práctica todos los otros métodos Behavioral, puede deshacerse de Behavioraly mover todos sus métodos a Shape.

RotatableToLefty RotatableToRightno tiene ningún sentido. Utiliza una única interfaz, que contiene sólo un método, y pasar la dirección del giro.

Es probable que necesite un par de 'Tryas' y 'es' y '' como métodos. Por ejemplo:

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; }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=297034&siteId=1
Recomendado
Clasificación