zoukankan      html  css  js  c++  java
  • 解释器模式Interpreter

    Interpreter,解释器模式:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 

    package com.qinsoft.design;
    
    import java.util.HashMap;
    
    abstract class Expression
    {
    
        //以环境类为准,本方法解释给定的任何一个表达式   
        public abstract boolean interpret(Content ctx);
    
        //检验两个表达式在结构上是否相同   
        public abstract boolean equals(Object o);
    
        //返回表达式的hash code   
        public abstract int hashCode();
    
        //将表达式转换成字符串   
        public abstract String toString();
    }
    
    class Constant extends Expression
    {
    
        private boolean value;
    
        public Constant(boolean value)
        {
            this.value = value;
        }
    
        //解释操作   
        public boolean interpret(Content ctx)
        {
            return value;
        }
    
        //检验两个表达式在结构上是否相同   
        public boolean equals(Object o)
        {
            if (o != null && o instanceof Constant) { return this.value == ((Constant) o).value; }
            return false;
        }
    
        //返回表达式的hash code   
        public int hashCode()
        {
            return (this.toString()).hashCode();
        }
    
        //将表达式转换成字符串   
        public String toString()
        {
            return new Boolean(value).toString();
        }
    }
    
    class Variable extends Expression
    {
    
        private String name;
    
        public Variable(String name)
        {
            this.name = name;
        }
    
        public boolean interpret(Content ctx)
        {
            return ctx.lookup(this);
        }
    
        public boolean equals(Object o)
        {
            if (o != null && o instanceof Variable) { return this.name.equals(((Variable) o).name); }
            return false;
        }
    
        public int hashCode()
        {
            return (this.toString()).hashCode();
        }
    
        public String toString()
        {
            return name;
        }
    }
    
    class And extends Expression
    {
    
        public Expression left, right;
    
        public And(Expression left, Expression right)
        {
            this.left = left;
            this.right = right;
        }
    
        public boolean interpret(Content ctx)
        {
            return left.interpret(ctx) && right.interpret(ctx);
        }
    
        public boolean equals(Object o)
        {
            if (o != null && o instanceof And) { return this.left.equals(((And) o).left) && this.right.equals(((And) o).right); }
            return false;
        }
    
        public int hashCode()
        {
            return (this.toString()).hashCode();
        }
    
        public String toString()
        {
            return "(" + left.toString() + " AND " + right.toString() + ")";
        }
    }
    
    class Or extends Expression
    {
    
        private Expression left, right;
    
        public Or(Expression left, Expression right)
        {
            this.left = left;
            this.right = right;
        }
    
        public boolean interpret(Content ctx)
        {
            return left.interpret(ctx) || right.interpret(ctx);
        }
    
        public boolean equals(Object o)
        {
            if (o != null && o instanceof Or) { return this.left.equals(((And) o).left) && this.right.equals(((And) o).right); }
            return false;
        }
    
        public int hashCode()
        {
            return (this.toString()).hashCode();
        }
    
        public String toString()
        {
            return "(" + left.toString() + " OR " + right.toString() + ")";
        }
    }
    
    class Not extends Expression
    {
    
        private Expression exp;
    
        public Not(Expression exp)
        {
            this.exp = exp;
        }
    
        public boolean interpret(Content ctx)
        {
            return !exp.interpret(ctx);
        }
    
        public boolean equals(Object o)
        {
            if (o != null && o instanceof Not) { return this.exp.equals(((Not) o).exp); }
            return false;
        }
    
        public int hashCode()
        {
            return (this.toString()).hashCode();
        }
    
        public String toString()
        {
            return "(NOT " + exp.toString() + ")";
        }
    }
    
    class Content
    {
    
        private HashMap<Variable, Boolean> map = new HashMap<Variable, Boolean>();
    
        public void assign(Variable var, boolean value)
        {
            map.put(var, new Boolean(value));
        }
    
        public boolean lookup(Variable var) throws IllegalArgumentException
        {
            Boolean value = (Boolean) map.get(var);
            if (value == null) { throw new IllegalArgumentException(); }
            return value.booleanValue();
        }
    }
    
    //客户端   
    public class Interpreter
    {
    
        private static Content ctx;
        private static Expression exp;
    
        public static void main(String args[])
        {
            ctx = new Content();
            Variable x = new Variable("x");
            Variable y = new Variable("y");
            Constant c = new Constant(true);
            ctx.assign(x, false);
            ctx.assign(y, true);
            exp = new Or(new And(c, x), new And(y, new Not(x)));
            System.out.println("x = " + x.interpret(ctx));
            System.out.println("y = " + y.interpret(ctx));
            System.out.println(exp.toString() + "=" + exp.interpret(ctx));
        }
    }
  • 相关阅读:
    WRF WPS预处理
    CVS安装
    Linux窗口最小化消失,任务栏上无法找到的解决方法
    NCARG安装配置出现error while loading shared libraries: libg2c.so.0问题额解决办法
    Netcdf安装
    Embedding R-generated Interactive HTML pages in MS PowerPoint(转)
    The leaflet package for online mapping in R(转)
    Some 3D Graphics (rgl) for Classification with Splines and Logistic Regression (from The Elements of Statistical Learning)(转)
    What does a Bayes factor feel like?(转)
    Weka算法介绍
  • 原文地址:https://www.cnblogs.com/hnhcc39/p/2832499.html
Copyright © 2011-2022 走看看