设计模式笔记(23)--解释器模式

作者: 球球球球笨 | 来源:发表于2018-06-08 09:55 被阅读15次

    解释器模式

    GOF对于解释器模式的定义是:“给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。”

    当有一个语言需要被解释继而被执行,并且可以将该语言中的句子表示为一个抽象的语法树时,可以使用解释器模式。
    解释器模式通过定义语言的文法,并且会建立一个解释器来解释语言中的句子。

    解释器模式主要包含四个角色:

    1. 在抽象表达式中声明了抽象的解释操作,他是所有的终结符表达式和非终结符表达式的公共父类。
    2. 终结符表达式也是抽象表达式的子类,实现与文法的终结符与之相关联的解释操作
    3. 非终结符表达式也是抽象表达式的子类,实现的是文法中非终结符的解释操作。
    4. 环境类,又称上下文类,用户存储解释器之外的一些全局信息
      解释器模式的主要优点包括易于改变以及拓展文法,并且易于实现文法并增加新的解释表达式的方式;主要缺点是复杂文法难以维护,执行效率较低,应用场景有限。

    接下来上代码

    package Interpreter2;
    
    public abstract class Expression {
        public void Interpret(Context context)
        {
            if(context.getMsgText().length() == 0)
            {
                System.out.println("空短信,不做处理");
            }
            else
            {
                Operate(context.getMsgText());
            }
        }
        public abstract void Operate(String msg);
    }
    
    package Interpreter2;
    
    public class NormalMessage extends Expression{
    
        @Override
        public void Operate(String msg) {
            // TODO Auto-generated method stub
            if(msg.contains("面试"))
            {
                System.out.println("恭喜收到了面试通知:"+msg);
            }
            else
            {
                System.out.println("普通短信:"+msg);
            }
        }
    }
    
    package Interpreter2;
    
    public class RubbishMessage extends Expression{
    
        @Override
        public void Operate(String msg) {
            // TODO Auto-generated method stub
            if(msg.contains("儿子"))
            {
                System.out.println("这是老妈发来的短信"+msg);
            }
            else
            {
                System.out.println("骗子短信猖獗,系统自动过滤掉啦!");
            }
        }
    }
    
    package Interpreter2;
    
    public class Context {
        private String msgText;
        public void setMsgText(String msgText)
        {
            this.msgText = msgText;
        }
        public String getMsgText()
        {
            return msgText;
        }
    }
    
    package Interpreter2;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class client {
        public static void main(String[] args)
        {
            Expression ex;
            Context msgC1 = new Context();
            Context msgC2 = new Context();
            Context msgC3 = new Context();
            
            msgC1.setMsgText("你好,你来面试吧!");
            msgC2.setMsgText("儿子,我给你汇款了!");
            msgC3.setMsgText("我,骗子,汇款,打钱给我吧");
            
            List<Context> msgs = new ArrayList<Context>();
            msgs.add(msgC1);
            msgs.add(msgC2);
            msgs.add(msgC3);
            
            for(int i = 0;i<msgs.size();i++)
            {
                Context temp = msgs.get(i);
                if(temp.getMsgText().contains("汇款"))
                {
                    System.out.println("系统收到了疑似骗子的短信:"+temp.getMsgText());
                    ex = new RubbishMessage();
                    ex.Interpret(temp);
                }
                else 
                {
                    System.out.println("收到正常的短信:"+temp.getMsgText());
                    ex = new NormalMessage();
                    ex.Interpret(temp);
                }
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:设计模式笔记(23)--解释器模式

        本文链接:https://www.haomeiwen.com/subject/edjosftx.html