Как реализовать шаблон Decorator в Spring Boot - PullRequest
0 голосов
/ 23 февраля 2019

Я знаю, как реализовать и использовать шаблон декоратора без Spring.

Поскольку в этом шаблоне вы сами управляете процессом создания компонентов и можете выполнять динамическое добавление поведения.

Ниже приведеноПример реализации без использования Spring:

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

Меня интересует, как реализовать тот же пример, но с помощью бобов Spring.

Потому что я не совсем понимаю, каксохраняйте гибкость в возможности простого переноса на любое количество декораторов.

Потому что, насколько я понимаю, он будет реализован фиксированным в каком-то отдельном компоненте, и мне придется создавать десятки различных отдельных компонентов с комбинациямидекораторы мне нужны.

1 Ответ

0 голосов
/ 23 февраля 2019

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

UpperCasePrinterDecorator
LowerCasePrinterDecorator
AddAsterisksPrinterDecorator 

Для каждого из них требуется экземпляр Printer, который, скажем, предоставляется как Spring @Component.Чтобы использовать каждый декоратор в качестве Spring Bean, вам нужно зарегистрировать его.

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

Затем вы можете использовать аннотацию @Qualifier, чтобы получить правильный @Autowired

@Autowired
@Qualifier("lowerCase")
private PrinterDecorator printer;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...