设计模式(18)----- 解释器模式

概念:

在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,这样就可以用 编译原理 中的解释器模式来实现了。

意图:

给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

主要解决:

对于一些固定文法构建一个解释句子的解释器。

优点:

  1. 可扩展性比较好,灵活。
  2. 增加了新的解释表达式的方式。
  3. 易于实现简单文法。

缺点:

  1. 可利用场景比较少。
  2. 对于复杂的文法比较难维护。
  3. 解释器模式会引起类膨胀。
  4. 解释器模式采用递归调用方法。

实现类图
在这里插入图片描述

模式的结构

解释器模式实现的关键是定义文法规则、设计终结符类与非终结符类、画出结构图,必要时构建语法树,其代码结构如下:

解释器模式包含以下主要角色。

抽象表达式(Abstract Expression)角色: 定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。

public interface 抽象表达式
{
    public bool 解释器(string info);
}

终结符表达式(Terminal Expression)角色: 是抽象表达式的子类,用来实现文法中与终结符相关的操作,文法中的每一个终结符都有一个具体终结表达式与之相对应。

using System.Collections.Generic;

public class 终结符表达式 : 抽象表达式
{   //一个用于记录终结符的哈希集
    private HashSet<string> set = new HashSet<string>();

    public 终结符表达式(string[] data)
    {
        for(int i = 0; i < data.Length; i++)
        {   //记录所有终结符
            set.Add(data[i]);
        }
    }

    //解释器  判断当前是否是终结符
    public bool 解释器(string info)
    {
        if (set.Contains(info))
        {
            return true;
        }
        return false;
    }
}

非终结符表达式(Nonterminal Expression)角色: 也是抽象表达式的子类,用来实现文法中与非终结符相关的操作,文法中的每条规则都对应于一个非终结符表达式。

public class 非终结符表达式 : 抽象表达式
{
    private 抽象表达式 mCity = null;
    private 抽象表达式 mPerson = null;

    public 非终结符表达式(抽象表达式 city,抽象表达式 person)
    {
        mCity = city;
        mPerson = person;
    }

    public bool 解释器(string info)
    {
        string[] s = info.Split("的");
        //解释  判断当前是否是终结符
        return mCity.解释器(s[0]) && mPerson.解释器(s[1]);
    }
}

环境(Context)角色: 通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据,后面的解释器可以从这里获取这些值。

using System;

public class 优惠政策
{
    private string[] countrys = {"本地","外地" };
    private string[] persons = { "学生", "老人" };
    private 抽象表达式 countryPerson;

    public 优惠政策()
    {
        抽象表达式 country = new 终结符表达式(countrys);
        抽象表达式 person = new 终结符表达式(persons);
        countryPerson = new 非终结符表达式(country, person);
    }

    public void 判断优惠(string info)
    {
        bool b = countryPerson.解释器(info);
        if (b) Console.WriteLine("您是" + info + "享受69折");
        else Console.WriteLine("您不满足我们的优惠要求  但我们可以给您抹个零!");
    }
}

测试:

using System;

class Program
{
    static void Main(string[] args)
    {
        优惠政策 a = new 优惠政策();
        a.判断优惠("本地的老人");
        a.判断优惠("外地的打工人");
        a.判断优惠("外地的学生");
        a.判断优惠("外国的学生");
        Console.Read();
    }
}

输出示例:
在这里插入图片描述

设计模式------首页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值