Seleccionar página

Se usa el patrón de diseño DECORATOR. Que en pocas palabras se encarga de envolver una clase con otra. Este patrón se usa sobre todo cuando no es adecuado usar la herencia para extender la clase.

La especificación de Java EE 6 nos ofrece “decorators” a través de CDI.

Tenemos un servicio que devuelve el saludo, pero queremos que ademas de vuelve la fecha y la hora, pero esto realmente no es parte de la lógica de devolver el saludo, así que en vez de ponerlo dentro del servicio vamos a envolverlo con un “decorator”.

El interface:


public interface HelloService {
String sayHello(String hello);
}

La implementación del interface devuelve el saludo


public class HelloServiceImpl implements HelloService {

@Override
public String sayHello(String hello) {
return "Server : " + hello;
}
}

Cuando no se puede usar un “decorator”, se puede crear una nueva implementación del mismo interface.


@Decorator
public class HelloServiceDecorator implements HelloService {

@Inject
@Delegate
private HelloService helloService;

 

@Override
public String sayHello(String hello) {
String helloServer = ticketService.sayHello(hello);
helloServer = new Date() + " (" + helloServer + ")";
return helloServer;
}
}

Con el “decorator” se añade al mensaje de vuelta la fecha.

Hemos usado 2 anotaciones de CDI. @Decorator que marca cual es el “decorator”, que debe tener la clase que queremos decorar marcada con @Delegate. Hay que darse cuenta que en el “decorator” hemos implementado el interface que implementa la clase que queremos envolver y no su implementación.

Si se injecta ahora sin hacer nada más se inyectaría la implementación normal:

@Inject private HelloService helloService;

Se podrían usar “Qualifiers” para indicar cual inyectar, pero vamos a configurarlo en el “beans.xml”:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<decorators>
<class>es.neodoo.decorator.HelloServiceDecorator</class>
</decorators>
</beans>

Share