Декоратор как шаблон проектирования состоит в том, чтобы обернуть целевой класс (декорируемый класс) и наделить его дополнительной функциональностью или непохожей функциональностью. CDI поддерживает шаблон проектирования декоратор вводя несколько аннотаций. Допустим у нас есть класс, который уже где-либо используется. Например он инжектирован в другой класс и вызывается оттуда. Если нам нужно изменить поведение этого класса, мы можем декорировать его и переписать функциональность.
Вот есть класс:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package common;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@RequestScoped
@PhoneNumber(value = Digits.ELEVEN)
public class ElevenNumberPhone implements PhoneNumberItf {
@Inject Logger log;
@Override
public String pnone() {
log.log(Level.INFO, "вызов метода pnone() ElevenNumberPhone");
Random rnd = new Random();
StringBuilder sb = new StringBuilder();
sb.append(rnd.nextInt(9));
sb.append("-");
for(int i = 0; i < 3; i ++){
sb.append(rnd.nextInt(9));
}
sb.append("-");
for(int i = 0; i < 3; i ++){
sb.append(rnd.nextInt(9));
}
sb.append("-");
for(int i = 0; i < 2; i ++){
sb.append(rnd.nextInt(9));
}
sb.append("-");
for(int i = 0; i < 2; i ++){
sb.append(rnd.nextInt(9));
}
return sb.toString();
}
}
Он вызывается отсюда (приведена точка инжекции)
@Inject
@PhoneNumber(value=Digits.ELEVEN)
private PhoneNumberItf phone_number;
Пишем декоратор, чтобы получить другой функционал:
package common;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.decorator.Decorator;
import javax.decorator.Delegate;
import javax.inject.Inject;
@Decorator
public class ElevenNumberPhoneDecorator implements PhoneNumberItf {
@Inject @PhoneNumber(value = Digits.ELEVEN) @Delegate
private PhoneNumberItf pnoneNumber;
@Inject Logger log;
@Override
public String pnone() {
log.log(Level.INFO, "вызов метода pnone() ElevenNumberPhoneDecorator");
//return pnoneNumber.pnone() + "---- 9999";
return "999-888-777";
}
}
|