使用当前规范(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并没有解决这个问题。
有什么方法我想不起或是蛋糕谎言?
答案 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的装饰器。