Java >> Tutorial de Java >  >> Java

¿Usar la herencia de esta manera es correcto?

Estoy aprendiendo Herencia en Java.

Estoy haciendo un programa (Bitcoin Mining Game). En el programa, hay diferentes tipos de excavadoras (Máquina Minera):

  • excavadora ordinaria (esto solo excava monedas),

  • excavador de overclocking (esto puede excavar y puede overclockear para excavar más rápido) y

  • excavadora de recuperación de durabilidad (esto puede cavar, hacer overclocking y recuperar durabilidad (cada excavadora tiene durabilidad, la durabilidad cae mientras cava).

Hice este diagrama de clases (hay algunos atributos y métodos que no describí en las imágenes. Pensé que no eran necesarios para mi pregunta):

No estoy seguro de haberlo hecho bien, en particular, el uso de Herencia.

En lugar de usar la herencia, ¿debería hacer una clase como esta? Porque solo una función agrega a las clases:

Respuesta

Este podría ser un buen candidato para Decorator Pattern, que le permite aplicar funciones personalizadas a un objeto individual en tiempo de ejecución. Se puede encontrar una buena referencia para esto en la página de Wikipedia de Decorator Pattern, que incluye un ejemplo detallado de un sistema de ventanas, con un diagrama de clase UML como referencia. Un fragmento del código muestra el decorador y el decorador concreto:

// abstract decorator class - note that it implements Window
abstract class WindowDecorator implements Window {
    private final Window windowToBeDecorated; // the Window being decorated

    public WindowDecorator (Window windowToBeDecorated) {
        this.windowToBeDecorated = windowToBeDecorated;
    }
    @Override
    public void draw() {
        windowToBeDecorated.draw(); //Delegation
    }
    @Override
    public String getDescription() {
        return windowToBeDecorated.getDescription(); //Delegation
    }
}

// The first concrete decorator which adds vertical scrollbar functionality
class VerticalScrollBarDecorator extends WindowDecorator {
    public VerticalScrollBarDecorator (Window windowToBeDecorated) {
        super(windowToBeDecorated);
    }

    @Override
    public void draw() {
        super.draw();
        drawVerticalScrollBar();
    }

    private void drawVerticalScrollBar() {
        // Draw the vertical scrollbar
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ", including vertical scrollbars";
    }
}

En tu caso el decorador se llamaría DiggerDecorator y los decoradores de hormigón podrían llamarse OverclockDecorator y RecoverDurabilityDecorator .

El código para instanciar un objeto completamente decorado podría verse así:

Digger decoratedDigger = new OverclockDecorator(new RecoverDurabilityDecorator(new SimpleDigger()));

Como puede ver, esta solución todavía usa la herencia, pero la funcionalidad individual se puede "mezclar" según sea necesario.


Etiqueta Java