Приветствую Вас ГостьВторник, 14.05.2024, 10:11

Программирование на Java, Android, Delphi


Блог

Главная » 2014 » Октябрь » 16 » Декораторы в CDI
11:02
Декораторы в CDI

Декоратор как шаблон проектирования состоит в том, чтобы обернуть целевой класс (декорируемый класс) и наделить его дополнительной функциональностью или непохожей функциональностью. 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";
 }
 
}
Категория: Java EE | Просмотров: 802 | Добавил: alex | Теги: CDI, декоратор | Рейтинг: 5.0/2
Категории раздела
Java (Общие вопросы) [17]
Java (Библиотека, пакеты Java) [17]
Java (Разработка программного обеспечения на Java) [5]
Java (Среда разработки NetBeans) [5]
JSF + PrimeFaces [21]
Java EE [11]
Разное [3]
Статистика

Онлайн всего: 2
Гостей: 2
Пользователей: 0
Форма входа
Поиск
Календарь
«  Октябрь 2014  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031
Архив записей