Interpreter Pattern 2
//[C] 2002 Sun Microsystems, Inc.--- import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; public class RunInterpreterPattern { public static void main(String[] arguments) { System.out.println("Example for the Interpreter pattern"); System.out.println("In this demonstration, the syntax defined"); System.out.println(" by the Interpreter can be used to search"); System.out.println(" among a collection of Contacts, returning"); System.out.println(" the subset that match the given search criteria."); ContactList candidates = makeContactList(); Context ctx = new Context(); System.out.println("Contents of the ContactList:"); System.out.println(candidates); System.out.println(); Contact testContact = new ContactImpl(); VariableExpression varLName = new VariableExpression(testContact, "getLastName"); ConstantExpression constLName = new ConstantExpression("u"); ContainsExpression eqLName = new ContainsExpression(varLName, constLName); System.out.println("Contents of the search on ContactList:"); System.out.println("(search was contains 'u' in Lase Name)"); Object result = candidates.getContactsMatchingExpression(eqLName, ctx, testContact); System.out.println(result); VariableExpression varTitle = new VariableExpression(testContact, "getTitle"); ConstantExpression constTitle = new ConstantExpression("LT"); EqualsExpression eqTitle = new EqualsExpression(varTitle, constTitle); System.out.println("Contents of the search on ContactList:"); System.out.println("(search was all LT personnel)"); result = candidates.getContactsMatchingExpression(eqTitle, ctx, testContact); System.out.println(result); System.out.println(); VariableExpression varLastName = new VariableExpression(testContact, "getLastName"); ConstantExpression constLastName = new ConstantExpression("S"); ContainsExpression cLName = new ContainsExpression(varLastName, constLastName); AndExpression andExpr = new AndExpression(eqTitle, cLName); System.out.println("Contents of the search on ContactList:"); System.out .println("(search was all LT personnel with 'S' in Last Name)"); result = candidates.getContactsMatchingExpression(andExpr, ctx, testContact); System.out.println(result); } private static ContactList makeContactList() { ContactList returnList = new ContactList(); returnList.addContact(new ContactImpl("James", "Kirk", "Captain", "USS Enterprise")); returnList.addContact(new ContactImpl("Mr.", "Spock", "Science Officer", "USS Enterprise")); returnList.addContact(new ContactImpl("LT", "Uhura", "LT", "USS Enterprise")); returnList.addContact(new ContactImpl("LT", "Sulu", "LT", "USS Enterprise")); returnList.addContact(new ContactImpl("Ensign", "Checkov", "Ensign", "USS Enterprise")); returnList.addContact(new ContactImpl("Dr.", "McCoy", "Ship's Doctor", "USS Enterprise")); returnList.addContact(new ContactImpl("Montgomery", "Scott", "LT", "USS Enterprise")); return returnList; } } interface Contact extends Serializable { public static final String SPACE = " "; public String getFirstName(); public String getLastName(); public String getTitle(); public String getOrganization(); public void setFirstName(String newFirstName); public void setLastName(String newLastName); public void setTitle(String newTitle); public void setOrganization(String newOrganization); } class ContactImpl implements Contact { private String firstName; private String lastName; private String title; private String organization; public ContactImpl() { } public ContactImpl(String newFirstName, String newLastName, String newTitle, String newOrganization) { firstName = newFirstName; lastName = newLastName; title = newTitle; organization = newOrganization; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public String getTitle() { return title; } public String getOrganization() { return organization; } public void setFirstName(String newFirstName) { firstName = newFirstName; } public void setLastName(String newLastName) { lastName = newLastName; } public void setTitle(String newTitle) { title = newTitle; } public void setOrganization(String newOrganization) { organization = newOrganization; } public String toString() { return firstName + SPACE + lastName; } } class ContactList implements Serializable { private ArrayList contacts = new ArrayList(); public ArrayList getContacts() { return contacts; } public Contact[] getContactsAsArray() { return (Contact[]) (contacts.toArray(new Contact[1])); } public ArrayList getContactsMatchingExpression(Expression expr, Context ctx, Object key) { ArrayList results = new ArrayList(); Iterator elements = contacts.iterator(); while (elements.hasNext()) { Object currentElement = elements.next(); ctx.addVariable(key, currentElement); expr.interpret(ctx); Object interpretResult = ctx.get(expr); if ((interpretResult != null) && (interpretResult.equals(Boolean.TRUE))) { results.add(currentElement); } } return results; } public void setContacts(ArrayList newContacts) { contacts = newContacts; } public void addContact(Contact element) { if (!contacts.contains(element)) { contacts.add(element); } } public void removeContact(Contact element) { contacts.remove(element); } public String toString() { return contacts.toString(); } } class Context { private HashMap map = new HashMap(); public Object get(Object name) { return map.get(name); } public void addVariable(Object name, Object value) { map.put(name, value); } } interface Expression { void interpret(Context c); } class OrExpression extends CompoundExpression { public OrExpression(ComparisonExpression expressionA, ComparisonExpression expressionB) { super(expressionA, expressionB); } public void interpret(Context c) { expressionA.interpret(c); expressionB.interpret(c); Boolean result = new Boolean(((Boolean) c.get(expressionA)) .booleanValue() || ((Boolean) c.get(expressionB)).booleanValue()); c.addVariable(this, result); } } abstract class CompoundExpression implements Expression { protected ComparisonExpression expressionA; protected ComparisonExpression expressionB; public CompoundExpression(ComparisonExpression expressionA, ComparisonExpression expressionB) { this.expressionA = expressionA; this.expressionB = expressionB; } } class ConstantExpression implements Expression { private Object value; public ConstantExpression(Object newValue) { value = newValue; } public void interpret(Context c) { c.addVariable(this, value); } } abstract class ComparisonExpression implements Expression { protected Expression expressionA; protected Expression expressionB; public ComparisonExpression(Expression expressionA, Expression expressionB) { this.expressionA = expressionA; this.expressionB = expressionB; } } class AndExpression extends CompoundExpression { public AndExpression(ComparisonExpression expressionA, ComparisonExpression expressionB) { super(expressionA, expressionB); } public void interpret(Context c) { expressionA.interpret(c); expressionB.interpret(c); Boolean result = new Boolean(((Boolean) c.get(expressionA)) .booleanValue() && ((Boolean) c.get(expressionB)).booleanValue()); c.addVariable(this, result); } } class VariableExpression implements Expression { private Object lookup; private String methodName; public VariableExpression(Object newLookup, String newMethodName) { lookup = newLookup; methodName = newMethodName; } public void interpret(Context c) { try { Object source = c.get(lookup); if (source != null) { Method method = source.getClass().getMethod(methodName, null); Object result = method.invoke(source, null); c.addVariable(this, result); } } catch (NoSuchMethodException exc) { } catch (IllegalAccessException exc) { } catch (InvocationTargetException exc) { } } } class EqualsExpression extends ComparisonExpression { public EqualsExpression(Expression expressionA, Expression expressionB) { super(expressionA, expressionB); } public void interpret(Context c) { expressionA.interpret(c); expressionB.interpret(c); Boolean result = new Boolean(c.get(expressionA).equals( c.get(expressionB))); c.addVariable(this, result); } } class ContainsExpression extends ComparisonExpression { public ContainsExpression(Expression expressionA, Expression expressionB) { super(expressionA, expressionB); } public void interpret(Context c) { expressionA.interpret(c); expressionB.interpret(c); Object exprAResult = c.get(expressionA); Object exprBResult = c.get(expressionB); if ((exprAResult instanceof String) && (exprBResult instanceof String)) { if (((String) exprAResult).indexOf((String) exprBResult) != -1) { c.addVariable(this, Boolean.TRUE); return; } } c.addVariable(this, Boolean.FALSE); return; } }
1. | Interpreter pattern in Java | ||
2. | Interpreter Pattern: Calculator |