我知道如何在没有 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 beans 的帮助下实现相同的示例很感兴趣。
因为我不太明白如何保持使用任意数量的装饰器进行简单包装的灵 active 。
因为据我所知 - 它将在一些单独的组件中固定实现,我将不得不使用我需要的装饰器组合创建几十个不同的单独组件。
最佳答案
我还不太明白你的实际问题是什么,但我还是会试试的。
假设你有这些类(class)
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;
关于java - 如何在Spring Boot中实现装饰器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54841554/