Outils pour utilisateurs

Outils du site


helloworld:design_pattern:interceptor:java

Pour trouver l'heure rapidement pour le log

DateTimeHelper.java
import java.text.SimpleDateFormat;
import java.util.Calendar;
 
public class DateTimeHelper {
  public static final String DATE_FORMAT_NOW = "yyyy-MM-dd H:mm:ss:SSS";
 
  public static String now() {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
    return sdf.format(cal.getTime());
  }
}

Classe décrivant la méthode à appeler (ici, par introspection).

Context.java
public class Context {
  private String classeName;
  private String data;
 
  public Context(String classeName, String data) {
    super();
    this.classeName = classeName;
    this.data = data;
  }
 
  public String getClasseName() {
    return classeName;
  }
 
  public String getData() {
    return data;
  }
}

Interface à respecter pour tous les intercepteurs.

Interceptor.java
public interface Interceptor {
  boolean before();
  public Object intercept(Context context) throws Exception;
  boolean after();
}

Opération à exécuter

Operation.java
public interface Operation {
  public abstract byte[] execute(String data);
}

Opération affiche HelloWorld dans la console.

OperationHelloWorld.java
public class OperationHelloWorld implements Operation {
  @Override
  public byte[] execute(String data) {
    System.out.println(data);
    return null;
  }
}

Appelle les intercepteurs

OperationInvokeInterceptor.java
import java.lang.reflect.Constructor;
 
public class OperationInvokeInterceptor implements Interceptor {
  private Context context;
 
  @Override
  public boolean before() {
    System.out.println(DateTimeHelper.now() + " - " + getClass().getName()
        + " before - création dynamique de l'instance de " + context.getClasseName());
    return false;
  }
 
  @Override
  public Object intercept(Context context) throws Exception {
    this.context = context;
 
    before();
 
    Class<?> classe = Class.forName("Operation" + context.getClasseName());
 
    Constructor<?> methodCtr = classe.getConstructor(new Class[] {});
    Operation op = (Operation) methodCtr.newInstance();
 
    Object ob = op.execute(context.getData());
    after();
 
    return ob;
  }
 
  @Override
  public boolean after() {
      System.out.println(DateTimeHelper.now() + " - " + getClass().getName() + " after");
      return false;
  }
}

Exemple de programme

Main.java
public class Main {
  public static void main(String[] args) {
    OperationInvokeInterceptor interceptor = new OperationInvokeInterceptor();
 
    try {
      interceptor.intercept(new Context("HelloWorld", "Bonjour moi"));
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
helloworld/design_pattern/interceptor/java.txt · Dernière modification : 2016/12/04 13:35 de root