2017-06-28 1 views
0

Je dispose d'un fichier de propriétés (a.txt) qui a les valeurs (valeurs exemple ci-dessous) comme ci-dessousfichier de propriété sur la base des modèles conditionnels en java

test1=10 
test2=20 
test33=34 
test34=35 

En lisant ce fichier, je dois produire une sortie comme ci-dessous

value = 35_20_34_10 

qui signifie => J'ai un motif comme test34_test2_test33_test1

Remarque, si le 'test33' a une valeur autre que 34 alors je besoin pour produire la valeur comme ci-dessous

value = 35_20_10 

qui signifie => J'ai un motif comme test34_test2_test1

Maintenant, mon problème est, à chaque fois que le client fait le changement dans la logique , Je fais le changement dans le code. Donc ce que je m'attends à être, je veux garder la logique (motif) dans un autre fichier de propriété, donc je vais envoyer les deux entrées au util (une entrée est le fichier de propriétés (A.txt) une autre entrée sera la ' pattern.txt '),

Mon util doit être comparer les A.txt et la logique métier « pattern.txt » et produire la sortie comme

value = 35_20_34_10 (or) 
value = 35_20_10 

Si un exemple pour une telle logique basée sur des modèles comme je m'attends? N'importe quelle classe util/java prédéfinie fait cela?

Toute aide serait géniale.

grâce, Harry

Répondre

1

D'abord, la réponse de svasa fait beaucoup de sens, mais couvre différents niveaux de abstraction. Je vous recommande de lire sa réponse aussi, ce modèle devrait être utile.

Vous souhaitez mai à regarder Apache Velocity et FreeMarker bibliothèques pour voir comment ils structurent leur API.

Ce sont template engine s - ils ont généralement une certaine abstraction de modèle ou de format, et l'abstraction de la liaison variable/valeur (ou espace de noms, ou source). Vous pouvez rendre un modèle en le liant avec un espace de nommage/de liaison, ce qui donne le résultat. Par exemple, vous pouvez avoir un modèle "<a> + <b>" et une liaison qui ressemble à une carte:. En liant cette liaison à ce modèle, vous obtiendrez "1 + 2", en interprétant <...> comme variables.

Vous chargez essentiellement le motif de votre pattern.txt, puis chargez votre fichier de données A.txt (par exemple, en le traitant comme des propriétés et l'utilisation de la classe Properties) et construire la liaison à partir de ces propriétés. Vous obtiendrez votre sortie et possibilité de personnaliser le motif tout le temps.

1

Vous pouvez appeler les séquences comme test34_test2_test33_test1 comme modèle, permettez-moi de les appeler comme contraintes lors de la construction de quelque chose.

Pour moi, ce problème correspond le mieux à un builder pattern.

Lors de la construction de la valeur que vous voulez, vous dites au constructeur que ce sont mes contraintes (motif) et ce sont mes propriétés originales comme ci-dessous:

new MyPropertiesBuilder().setConstraints(constraints).setProperties(original).buildValue(); 

Détails:

Définir certaines contraintes dans un fichier séparé où vous spécifiez l'ordre des propriétés et leurs valeurs comme:

test34=desiredvalue-could-be-empty 
test2=desiredvalue-could-be-empty 
test33=34 
test1=desiredvalue-could-be-empty 

r passe en revue les contraintes dans l'ordre spécifié, mais récupère les valeurs des propriétés d'origine et construit la chaîne désirée.

Une façon d'atteindre vos besoins par modèle de constructeur est de définir des classes comme ci-dessous:

Interface:

public interface IMyPropertiesBuilder 
{ 
    public void setConstraints(Properties properties); 

    public void setProperties(Properties properties); 

    public String buildValue(); 
} 

Builder

public class MyPropertiesBuilder implements IMyPropertiesBuilder 
{ 
    private Properties constraints; 

    private Properties original; 


    @Override 
    public void setConstraints(Properties constraints) 
    { 
     this.constraints = constraints; 
    } 

    @Override 
    public String buildValue() 
    { 
     StringBuilder value = new StringBuilder(); 

     Iterator it = constraints.keySet().iterator(); 

     while (it.hasNext()) 
     { 
      String key = (String) it.next(); 
      if (original.containsKey(key) && constraints.getProperty(key) != null && original.getProperty(key).equals(constraints.getProperty( key))) 
      { 
       value.append(original.getProperty(key)); 
       value.append("_"); 
      } 
     } 

     return value.toString(); 
    } 

    @Override 
    public void setProperties(Properties properties) 
    { 
     this.original = properties; 
    } 


} 

utilisateur

public class MyPropertiesBuilderUser 
{ 

    private Properties original = new Properties().load(new FileInputStream("original.properties"));; 

    private Properties constraints = new Properties().load(new FileInputStream("constraints.properties")); 

    public String getValue() 
    { 

    String value = new MyPropertiesBuilder().setConstraints(constraints).setProperties(original).buildValue(); 
    } 
}