亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

設計模式筆記(23)--解釋器模式

標簽:
設計

解释器模式

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);
            }
        }
    }
}

webp



作者:球球球球笨
链接:https://www.jianshu.com/p/9133984f714a


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消