Java Reference
In-Depth Information
LISTING 7-8 (continued)
public void setPrice(double price) {
this.price = price;
public String getLabel() {
return label;
public double getPrice() {
return price;
public String generateLabel() {
return price + ", " + label;
You create the PriceDiscountDecorator decorator by implementing the Product interface. This class
implements the generateLabel method and adds its discounting behavior. The decorator reduces the
price of a product by 50 percent and adds the text “(Discounted)” to the product's label.
To enable the container to identify this class as a decorator, you must annotate it with @Decorator .
The delegate injection point (the instance that will be decorated) is annotated with @Delegate and
must be an injected i eld, an initializer method parameter, or a bean constructor method parameter.
The delegate type must be the interface implemented by the classes that you want to be decorated—
in this case, Product . The CDI container injects any available instance of the Product interface into
the product
member variable as shown in Listing 7‐9.
LISTING 7‐9: The PriceDiscountDecorator decorator
public class PriceDiscountDecorator implements Product {
private Product product;
public String generateLabel() {
product.setPrice(product.getPrice() * 0.5);
product.setLabel(product.getLabel() + " (Discounted)");
return product.generateLabel();
// Not all methods shown
Finally, you must declare the decorator in bean.xml . Although most of the coni guration has already
been done via annotations, you still need to add some XML coni guration to make the decorator
Search WWH ::

Custom Search