Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Interpreter design pattern #18

Open
wants to merge 5 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 32 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -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.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added diagrams/interpreterPattenSequenceDiagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 31 additions & 2 deletions pattern/src/com/premaseem/Client.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
}


20 changes: 20 additions & 0 deletions pattern/src/com/premaseem/Context.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
63 changes: 63 additions & 0 deletions pattern/src/com/premaseem/Expression.java
Original file line number Diff line number Diff line change
@@ -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);
}
}

13 changes: 0 additions & 13 deletions patternBonus/src/com/premaseem/Client.java

This file was deleted.