Motor de reglas: intercalado con puntos de conocimiento

caché LRU

La expresión aviatar usa caché LRU.

  • com.googlecode.aviator.utils.LRUMap

Utilice el mapa de lista vinculada: LinkedHashMappara reescribir el método removeEldestEntry (elimine el elemento más antiguo): el tamaño actual es mayor que el tamaño máximo: maxCapacity. Es decir, se ajusta a LRU (Least Recent Used), es decir, el menos utilizado recientemente, es decir, seleccionar el que lleva más tiempo sin usarse para ser eliminado.

public class LRUMap<K, V> extends LinkedHashMap<K, V> {
    
    
  static final long serialVersionUID = -1L;

  private final int maxCapacity;


  public LRUMap(final int maxCapacity) {
    
    
    super(16, 0.75f, true);
    if (maxCapacity <= 0) {
    
    
      throw new IllegalArgumentException("Invalid maxCapacity: " + maxCapacity);
    }
    this.maxCapacity = maxCapacity;

  }


  @Override
  public V remove(final Object key) {
    
    
    return super.remove(key);
  }


  @Override
  public int size() {
    
    
    return super.size();
  }


  @Override
  public V put(final K k, final V v) {
    
    
    return super.put(k, v);
  }


  @Override
  public V get(final Object k) {
    
    
    return super.get(k);
  }


  @Override
  protected boolean removeEldestEntry(final java.util.Map.Entry<K, V> eldest) {
    
    
    return this.size() > this.maxCapacity;
  }

}

Proxy dinámico Java y proxy dinámico asm

easy-rule usa un proxy dinámico java ordinario para implementar el motor de reglas; aviatar usa asm para generar dinámicamente la clase de expresión que se ha ejecutado

proxy dinámico java

Todas las clases de proxy heredan Proxy. Debido a la herencia única de Java, si desea extender una clase, debe basarla en la interfaz; use el mecanismo de reflexión interno de Java para lograrlo.

proxy dinámico asm

ASM es un marco de manipulación de código de bytes de Java. Puede modificar clases existentes o generar clases dinámicamente en forma binaria y generar directamente nuevos archivos .class.

Modo visitante

Características del modo visirot

El patrón de visitante desacopla la estructura de datos de las operaciones en la estructura, de modo que el conjunto de operaciones puede evolucionar con relativa libertad.

El patrón de visitante es adecuado para sistemas donde la estructura de datos es relativamente estable y el algoritmo es fácil de cambiar . Porque el patrón de visitantes facilita el aumento de las operaciones algorítmicas. Si los objetos de la estructura de datos del sistema son fáciles de cambiar y con frecuencia se agregan nuevos objetos de datos, no es adecuado utilizar el modo visitante.

La ventaja del patrón de visitantes es que es fácil agregar operaciones, porque agregar operaciones significa agregar nuevos visitantes. El patrón de visitante concentra comportamientos relevantes en un objeto de visitante y sus cambios no afectan la estructura de datos del sistema. La desventaja es que es difícil agregar nuevas estructuras de datos.

Código de ejemplo:

Diferentes coches son visitados por diferentes grupos de personas:
inserte la descripción de la imagen aquí

Abstracción de objetos accedidos

public interface Car {
    
    
    String getName();
    /**
     * 接受访问者的访问
     * @param visitor 访问者对象
     */
    void accept(Visitor visitor);
}

visitante

public interface Visitor {
    
    
    void visitElectricityCar(ElectricityCar electricityCar);

    void visitOilCar (OilCar oilCar);
}

objeto específico del entrevistado

public class ElectricityCar implements Car {
    
    
    private String name;

    public ElectricityCar(String name){
    
    
        this.name = name;
    }
    @Override
    public String getName() {
    
    
        return name;
    }

    @Override
    public void accept(Visitor visitor) {
    
    
        visitor.visitElectricityCar(this);
    }
}
public class OilCar implements Car {
    
    

    private String name;

    public OilCar(String name) {
    
    
        this.name = name;
    }

    @Override
    public String getName() {
    
    
        return this.name;
    }

    @Override
    public void accept(Visitor visitor) {
    
    
        visitor.visitOilCar(this);
    }

}
  • visitante específico
public class SaleVisitor implements Visitor{
    
    

    @Override
    public void visitElectricityCar(ElectricityCar electricityCar) {
    
    
        System.out.println("销售查看详情:" + electricityCar.getName());
    }

    @Override
    public void visitOilCar(OilCar oilCar) {
    
    
        System.out.println("销售查看详情:" + oilCar.getName());
    }
}

public class ConsumerVisitor implements Visitor{
    
    

    @Override
    public void visitElectricityCar(ElectricityCar electricityCar) {
    
    
        System.out.println("消费者查看价格:" + electricityCar.getName());
    }

    @Override
    public void visitOilCar(OilCar oilCar) {
    
    
        System.out.println("消费者查看价格:" + oilCar.getName());
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_26437925/article/details/131057882
Recomendado
Clasificación