FreeOnGoo:
私は春なしでDecoratorパターンを実装して使用する方法を知っています。
このパターンでは、あなた自身がコンポーネントを作成するプロセスを制御し、あなたは追加動的挙動を実行することができますので。
以下は、春を使用せずに、実装の例です。
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);
}
}
私は、同じ例を実装する方法ではなく、春の豆の助けを借りて、興味を持っています。
私は非常に単純にデコレータの任意の数でラップする能力に柔軟性を維持する方法を理解していないので。
私はそれを理解しているので - それはいくつかの別個の構成要素で固定実装され、私が必要デコレータの組み合わせで様々な別個の構成要素を多数作成する必要があります。
LppEdd:
私は本当にあなたの実際の問題がここにあるものを理解していないが、私はとにかく頑張ります。
あなたはこれらのクラスを持っていると言います
UpperCasePrinterDecorator
LowerCasePrinterDecorator
AddAsterisksPrinterDecorator
これらはそれぞれのインスタンスを必要としPrinter
てみましょうと言うが春として提供されています、@Component
。春の豆として各デコレータを使用するには、それを登録する必要があります。
@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;