java - 如何在Spring Boot中实现装饰器模式

标签 java spring spring-boot design-patterns

我知道如何在没有 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/

相关文章:

java - Android 按钮循环

java - 如何自动将所有 Lucene TermQuery 对象转换为 PrefixQuery?

java - IntelliJ Lombok - src/integration-test 类看不到生成的 lombok 代码

java - 如何以干净的方式在 Spring Data Redis 中实现事务?

java - Spring中如何使用泛型?

java - 仅当 bean 作为方法参数存在时,Spring 才会 Autowiring

java - javafx/scenebuilder 文本字段或标签中的 mysql 数据

java - spring boot + redis cache + @Cacheable 适用于某些方法而不适用于其他方法

javascript - 在 React 中的 POST 之前禁用 OPTIONS 请求

spring-boot - Spring Security OAuth2 是否支持带有 PKCE 的浏览器(Angular)客户端的授权代码流?