23 Modes de conception Chapitre 15: Mode interprète Java
Définition: Compte tenu d'une langue, définissez une représentation de sa grammaire et définissez un interprète qui utilise la représentation pour interpréter les phrases dans la langue.
Type: modèle de comportement
Diagramme de classe:
Le mode interprète est un mode relativement rarement utilisé, et je n'ai jamais utilisé ce mode auparavant. Jetons un coup d'œil au mode interprète.
Structure du mode interprète
Interprète abstrait: Déclarez une interface abstraite (ou classe abstraite) à laquelle toutes les expressions concrètes doivent être mises en œuvre. L'interface est principalement une méthode d'interprétation (), appelée opération d'explication. La tâche d'interprétation spécifique est effectuée par ses différentes classes d'implémentation, et l'interprète spécifique est complété par l'interprète Terminator Terminalexpression et l'interprète non terminal respectivement non terminalexpression.
Expression du terminateur: met en œuvre les opérations d'interprétation associées aux éléments de la grammaire. Habituellement, il n'y a qu'une seule expression de terminateur dans un modèle d'interprète, mais il y a plusieurs instances, correspondant à différents terminateurs. La moitié du terminateur est une unité de fonctionnement de la grammaire. Par exemple, il existe une formule simple R = R1 + R2, où R1 et R2 sont des terminateurs, et les interprètes correspondants qui analysent R1 et R2 sont des terminateurs.
Expression non terminale: chaque règle de la grammaire correspond à une expression non terminale. Les expressions non terminales sont généralement des opérateurs ou d'autres mots clés de la grammaire. Par exemple, dans la formule R = R1 + R2, + est un caractère non terminal, et l'interprète de l'analyse + est un caractère non terminal. Les expressions non terminales augmentent en fonction de la complexité de la logique et, en principe, chaque règle de grammaire correspond à une expression non terminale.
Rôle de l'environnement: La tâche de ce rôle est généralement utilisée pour stocker les valeurs spécifiques correspondant à chaque terminateur de la grammaire, tels que R = R1 + R2. Nous attribuons 100 à R1 et 200 à R2. Ces informations doivent être stockées dans le rôle de l'environnement. Dans de nombreux cas, nous utilisons la carte pour agir comme le rôle de l'environnement est suffisant.
Implémentation de code
Classe Context {} Résumé Expression de classe {Interprète d'objet abstrait public (Context CTX); } class terminalexpression étend l'expression {public objet interprète (contexte ctx) {return null; }} classe non terminalexpression étend l'expression {public nonterminalexpression (expression ... expressions) {} Interpréteur d'objet public (contexte ctx) {return null; }} public class Client {public static void main (String [] args) {String expression = ""; char [] chararray = expression.tocharArray (); Context CTX = nouveau contexte (); Stack <pression> stack = new Stack <pression> (); for (int i = 0; i <chararray.length; i ++) {// faire du jugement de syntaxe et appeler récursivement} expression exp = stack.pop (); Exp.Interpreter (CTX); }}La partie du code de la récursivité grammaticale doit être mise en œuvre en fonction de la situation spécifique, il ne se reflète donc pas dans le code. Les expressions abstraites sont la clé pour générer une collection grammaticale. Chaque expression non terminale interprète une unité de syntaxe minimale, puis combine avec récursivement ces unités de syntaxe en une grammaire complète. Ceci est le modèle d'interprète.
Avantages et inconvénients du mode interprète
L'interprète est un simple outil d'analyse de syntaxe. Son avantage le plus significatif est son extensibilité. La modification des règles de syntaxe nécessite uniquement de modifier les caractères non terminaux correspondants. Si vous développez la syntaxe, il vous suffit d'ajouter un caractère non terminal.
Cependant, le modèle d'interprète entraînera l'expansion de la classe et chaque syntaxe doit produire une expression non terminale. Lorsque les règles de syntaxe sont relativement complexes, un grand nombre de fichiers de classe peuvent être générés, ce qui demande beaucoup de problèmes à la maintenance. Dans le même temps, puisque la méthode d'appel récursive est adoptée, chaque expression non terminale ne se soucie que des expressions liées à elle-même. Chaque expression doit connaître le résultat final et doit être récursive. Qu'il s'agisse d'une langue orientée objet ou d'une langue axée sur le processus, la récursivité est une manière non recommandée. En raison de l'utilisation de nombreuses boucles et de la récursivité, l'efficacité est un problème qui ne peut être ignoré. Surtout lorsqu'il est utilisé pour interpréter un complexe d'analyse, une longue syntaxe, l'efficacité est insupportable.
Scénarios applicables pour le mode interprète
Le mode interprète peut être utilisé dans les cas suivants:
Il existe une règle de syntaxe simple, comme une instruction SQL. Si nous devons effectuer une conversion RM basée sur les instructions SQL, nous pouvons utiliser le modèle d'interprète pour interpréter l'instruction.
Certains problèmes répétitifs, tels que les quatre opérations d'addition, de soustraction, de multiplication et de division, mais les formules sont différentes à chaque fois. Parfois, c'est un + BC * D, parfois c'est un CD * B +, etc. Les formules changent en constante évolution, mais elles sont toutes connectées par les quatre caractères non terminaux d'addition, de soustraction, de multiplication et de division. Pour le moment, nous pouvons utiliser le mode interprète.
Choses à noter
Le mode interprète est vraiment un mode relativement rarement utilisé car il est trop gênant pour le maintenir. Imaginez que si un tas d'interprètes non terminaux ne connaissent pas les règles de la grammaire à l'avance, ou si la grammaire est particulièrement simple, il sera difficile de comprendre sa logique. Le mode interprète est rarement utilisé dans le développement réel du système car il peut entraîner des problèmes tels que l'efficacité, les performances et la maintenance.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.