Cómo implementar el patrón decorador en la primavera de arranque

FreeOnGoo:

Sé cómo implementar y usar un patrón decorador sin muelle.

Debido a que en este patrón usted mismo controlar el proceso de creación de componentes y puede realizar añadiendo comportamiento dinámico.

A continuación se muestra un ejemplo de aplicación sin necesidad de utilizar la primavera:

public class SimpleDecoratorApp {
    public static void main(String[] args) {
        SimplePrinter simplePrinter = new SimplePrinter();

        Printer decorated = new UpperCasePrinterDecorator(
                new AddAsterisksPrinterDecorator(simplePrinter)
        );
        decorated.print("hello");   // *** HELLO ***
    }
}

interface Printer {
    void print(String msg);
}

class SimplePrinter implements Printer {
    @Override
    public void print(String msg) {
        System.out.println(msg);
    }
}

abstract class PrinterDecorator implements Printer {
    protected Printer printer;
    public PrinterDecorator(Printer printer) {
        this.printer = printer;
    }
}

class UpperCasePrinterDecorator extends PrinterDecorator {
    public UpperCasePrinterDecorator(Printer printer) {
        super(printer);
    }
    @Override
    public void print(String msg) {
        String s = msg.toUpperCase();
        this.printer.print(s);
    }
}

class AddAsterisksPrinterDecorator extends PrinterDecorator {
    public AddAsterisksPrinterDecorator(Printer printer) {
        super(printer);
    }
    @Override
    public void print(String msg) {
        msg = "*** " + msg + " ***";
        this.printer.print(msg);
    }
}

Estoy interesado en la forma de aplicar el mismo ejemplo pero con la ayuda de los granos de la primavera.

Porque yo no entiendo muy bien cómo mantener la flexibilidad en la capacidad de envolver simplemente con cualquier número de decoradores.

Debido a mi entender - que se llevará a cabo fija en algún componente separado y voy a tener que crear docenas de diversos componentes por separado con las combinaciones de decoradores que necesito.

LppEdd:

No he entendido realmente lo que es el problema real aquí, pero voy a intentarlo de todos modos.
Digamos que usted tiene estas clases

UpperCasePrinterDecorator
LowerCasePrinterDecorator
AddAsterisksPrinterDecorator 

Cada uno de estos requieren una instancia de una Printer, que, se proporciona por ejemplo nos dejó como un resorte @Component. Para utilizar cada decorador como beans Spring necesita para registrarlo.

@Bean
@Qualifier("upperCase")
PrinterDecorator upperCasePrinterDecorator(final Printer printer) { // Injected automatically
   return new UpperCasePrinterDecorator(printer);
}

@Bean
@Qualifier("lowerCase")
PrinterDecorator lowerCasePrinterDecorator(final Printer printer) {
   return new LoweCasePrinterDecorator(printer);
}

@Bean
@Qualifier("asterisk")
PrinterDecorator addAsterisksPrinterDecorator(final Printer printer) {
   return new AddAsterisksPrinterDecorator(printer);
}

A continuación, puede utilizar la @Qualifieranotación para conseguir la correcta@Autowired

@Autowired
@Qualifier("lowerCase")
private PrinterDecorator printer;

Supongo que te gusta

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