CDI类爆炸

时间:2018-01-09 18:08:31

标签: cdi decorator

使用当前规范(2.0),无法防止类爆炸 像装饰模式那样的问题:

Cake cakeWithToppings = new ColoredSprinklesDecorator(new ShavedChocolateDecorator(new ToastedCoconutDecorator(new BaseCake())));

cakeWithToppings.delish();

现在要使用CDI,我们的选项是创建所有可能的组合 蛋糕浇头(2 ^ 3 = 8)作为类或生产者方法与限定符 将产生限定符和生产者方法爆炸的问题。

当使用GoF装饰器时,只需要5个类Cake,CakeDecorator,ColoredSprinklesDecorator,ShavedChocolateDecorator,ToastedCoconutDecorator,BaseCake。

我可以看到@Decorator并没有解决这个问题。

有什么方法我想不起或是蛋糕谎言?

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你的观点,但我会试一试......

我认为你在这里混合了两件事--GoF的装饰模式和CDI的装饰器,这不是该模式的实现。

在CDI中,@Decorator可以被视为“语义感知”拦截器,而不是GoF的Decorator模式的实现。 这意味着它可以包含对给定类型的底层bean的调用,同时能够利用语义。 例如。你可以创建一个装饰器,它将所有调用包装到任何Cake

@Decorator
@Priority(1)
public class CakeDecorator implements Cake {
 @Inject
 @Delegate
 Cake cake; // this will cause to it decorate all cakes

 public void delish() {
 // do stuff BEFORE actual cake's delish() invocation
 addMoreChocolate(cake);

 cake.delish(); // this is the original method invocation

 // do stuff AFTER actual cake's delish() invocation
 cleanUp(cake);
 }
}

但是你也可以轻松地修改装饰器以仅触发某些类型的蛋糕 - 你可以通过更改代表注入点,或者只是通过使用方法体检查蛋糕类型来实现。如果您愿意,也可以链接几个装饰器。

我会说CDI的装饰师是为了达到略微不同的目标。事实上,您可以根据GoF的原则设计一个装饰器,然后在其上面应用CDI的装饰器。