diff --git a/README.md b/README.md index 9e0034c..debe0af 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,32 @@ -# DesignPatternsJava9 -This repo consists Gang of Four Design patterns code on Java 9. Each branch in the repository has code of 1 design pattern. Switch repository to try out different design patterns. +# What is Interpreter Design Pattern +Interpreter pattern provides a way to evaluate language grammar or expression. + +## Diagram +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob/interpreter-pattern/diagrams/IntrepreterDesignPatternClassDiagram.jpeg "Diagram") + +![Diagram](https://github.com/premaseem/DesignPatternsJava9/blob//interpreter-pattern/diagrams/interpreterPattenSequenceDiagram.png "Diagram") + +# When to use Interpreter Design Pattern +* Specialized database query languages such as SQL. +* Specialized computer languages that are often used to describe communication protocols. +Voice command based apps. + +### Learn Design Patterns with Java by Aseem Jain +This repository contains working project code used in video Course by Packt Publication with title "Learn Design Patterns with Java " authored by "Aseem Jain". + +### Course link: +https://www.packtpub.com/application-development/learn-design-patterns-java-9-video + +### ![ http://in.linkedin.com/in/premaseem](https://github.com/premaseem/DesignPatternsJava9/blob/master/linkedin.png "http://in.linkedin.com/in/premaseem") Profile: http://in.linkedin.com/in/premaseem + +### Authors blog on design patterns: +https://premaseem.wordpress.com/category/computers/design-patterns/ + +### Software Design pattern community face book page: +https://www.facebook.com/DesignPatternGuru/ + +### Note: +* This code base will work on Java 9 and above versions. +* `diagrams` folders carry UML diagrams. +* `pattern` folder has code of primary example. +* `patternBonus` folder has code of secondary or bonus example. diff --git a/diagrams/IntrepreterDesignPatternClassDiagram.jpeg b/diagrams/IntrepreterDesignPatternClassDiagram.jpeg new file mode 100644 index 0000000..bc722e7 Binary files /dev/null and b/diagrams/IntrepreterDesignPatternClassDiagram.jpeg differ diff --git a/diagrams/interpreterPattenSequenceDiagram.png b/diagrams/interpreterPattenSequenceDiagram.png new file mode 100644 index 0000000..f94f7c4 Binary files /dev/null and b/diagrams/interpreterPattenSequenceDiagram.png differ diff --git a/pattern/src/com/premaseem/Client.java b/pattern/src/com/premaseem/Client.java index 15f05df..592cbca 100644 --- a/pattern/src/com/premaseem/Client.java +++ b/pattern/src/com/premaseem/Client.java @@ -1,13 +1,42 @@ package com.premaseem; +import java.util.Scanner; + /* @author: Aseem Jain @title: Design Patterns with Java 9 @link: https://premaseem.wordpress.com/category/computers/design-patterns/ -@copyright: 2018 Packt Publication */ public class Client { public static void main (String[] args) { - System.out.println("Singleton cook example "); + System.out.println("Alexa welcomes you to Artificial intelligence app designed using Interpreter Design pattern :-) "); + Scanner scanner1 = new Scanner(System.in); + Scanner scanner2 = new Scanner(System.in); + + // User input block + String repeatRunFlag = "yes"; + while (!repeatRunFlag.equalsIgnoreCase("no")) { + System.out.println("\n Please ask your question related to voting ..."); + String question = scanner1.nextLine(); + + // get Voting context + Context votingContext = new VotingContext(); + + // get Rules or grammar around context + Expression ruleExpression = votingContext.getRuleExpression(); + + // question is interpreted based on context and rules + Boolean result = ruleExpression.interpret(question); + + // print Results + String voteEligible = result ? "Yes ! can vote :-) ":"No ! cannot vote :-)"; + System.out.println("Alexa answered: " + voteEligible); + + // Ask from another questions + System.out.println("Do you have another questions ? yes / no "); + repeatRunFlag = scanner2.next(); + } } } + + diff --git a/pattern/src/com/premaseem/Context.java b/pattern/src/com/premaseem/Context.java new file mode 100644 index 0000000..627ecac --- /dev/null +++ b/pattern/src/com/premaseem/Context.java @@ -0,0 +1,20 @@ +package com.premaseem; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +interface Context { + Expression getRuleExpression (); +} + +class VotingContext implements Context { + + @Override + public Expression getRuleExpression () { + Expression condition_1 = new TerminalExpression("citizen"); + Expression condition_2 = new TerminalExpression("18"); + return new AndExpression(condition_1, condition_2); + } +} diff --git a/pattern/src/com/premaseem/Expression.java b/pattern/src/com/premaseem/Expression.java new file mode 100644 index 0000000..35d87a0 --- /dev/null +++ b/pattern/src/com/premaseem/Expression.java @@ -0,0 +1,63 @@ +package com.premaseem; + +/* +@author: Aseem Jain +@title: Design Patterns with Java 9 +@link: https://premaseem.wordpress.com/category/computers/design-patterns/ +*/ +interface Expression { + public boolean interpret (String context); +} + +/** + * Terminal Expression is used in other expressions for interpretation + */ +class TerminalExpression implements Expression { + + private String data; + + public TerminalExpression(String data){ + this.data = data; + } + + @Override + public boolean interpret(String context) { + if(context.contains(data)){ + return true; + } + return false; + } +} + +class AndExpression implements Expression { + + private Expression expr1 = null; + private Expression expr2 = null; + + public AndExpression(Expression expr1, Expression expr2) { + this.expr1 = expr1; + this.expr2 = expr2; + } + + @Override + public boolean interpret(String context) { + return expr1.interpret(context) && expr2.interpret(context); + } +} + +class OrExpression implements Expression { + + private Expression expr1 = null; + private Expression expr2 = null; + + public OrExpression(Expression expr1, Expression expr2) { + this.expr1 = expr1; + this.expr2 = expr2; + } + + @Override + public boolean interpret(String context) { + return expr1.interpret(context) || expr2.interpret(context); + } +} + diff --git a/patternBonus/src/com/premaseem/Client.java b/patternBonus/src/com/premaseem/Client.java deleted file mode 100644 index 15f05df..0000000 --- a/patternBonus/src/com/premaseem/Client.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.premaseem; - -/* -@author: Aseem Jain -@title: Design Patterns with Java 9 -@link: https://premaseem.wordpress.com/category/computers/design-patterns/ -@copyright: 2018 Packt Publication -*/ -public class Client { - public static void main (String[] args) { - System.out.println("Singleton cook example "); - } -}