行为型模式 - 解释器模式Interpreter
学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。
模式的定义与特点
解释器模式(Interperter Pattern),给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。
模式的优点
- 可扩展性比较好,灵活。
- 增加了新的解释表达式的方式。
- 易于实现简单文法。
模式的缺点
- 可利用场景比较少。
- 对于复杂的文法比较难维护。
- 解释器模式会引起类膨胀。
- 解释器模式采用递归调用方法。
using DesignPattern.InterpreterPattern;
using System;
namespace DesignPattern
{
internal class Program
{
static void Main(string[] args)
{
InterpreterHelper();
}
#region Pattern - Interpreter
static void InterpreterHelper()
{
Interpreter _root1 = new CheckContentsExistence("Root1");
Interpreter _root2 = new CheckContentsExistence("Root1");
Interpreter _orExpr1 = new OrExpression(_root1, _root2);
Console.WriteLine($"root 存在么:{_orExpr1.Interpret("root")}");
Console.WriteLine();
Interpreter _shanshan = new CheckContentsExistence("Shanshan");
Interpreter _pig = new CheckContentsExistence("pig");
Interpreter _isExpr2 = new AndExpression(_shanshan, _pig);
Console.WriteLine($"Shanshan is a little pig? {_isExpr2.Interpret("pig Shanshan")}");
Console.ReadLine();
}
#endregion
}
}
//======================================================================================
namespace DesignPattern.InterpreterPattern
{
/// <summary>
/// 解释器接口
/// </summary>
public interface Interpreter
{
/// <summary>
/// 解释器
/// </summary>
/// <param name="context">具体内容</param>
/// <returns></returns>
bool Interpret(string context);
}
/// <summary>
/// 解释具体内容是否存在该元素中
/// </summary>
public class CheckContentsExistence : Interpreter
{
private string m_data;
public CheckContentsExistence(string data)
{
this.m_data = data;
}
public bool Interpret(string context)
{
if (context.Contains(m_data))
{
return true;
}
return false;
}
}
/// <summary>
/// 或运算
/// </summary>
public class OrExpression : Interpreter
{
private Interpreter m_expr1 = null;
private Interpreter m_expr2 = null;
public OrExpression(Interpreter expression1, Interpreter expression2)
{
this.m_expr1 = expression1;
this.m_expr2 = expression2;
}
public bool Interpret(string context)
{
return m_expr1.Interpret(context) || m_expr2.Interpret(context);
}
}
/// <summary>
/// 和运算
/// </summary>
public class AndExpression : Interpreter
{
private Interpreter m_expr1 = null;
private Interpreter m_expr2 = null;
public AndExpression(Interpreter expression1, Interpreter expression2)
{
this.m_expr1 = expression1;
this.m_expr2 = expression2;
}
public bool Interpret(string context)
{
return m_expr1.Interpret(context) && m_expr2.Interpret(context);
}
}
}
总结:
个人觉得,应该是一个框架中有些特殊处理的信息,或者内容需要被处理,就会用到解释器模式,比如框架中使用string,不希望在字符串中出现红信息,那就重写string,在遇到红信息时直接过滤、或者是找到替代信息进行替换。
希望大家:点赞,留言,关注咯~
唠家常
今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我QQ:841298494,大家一起进步。
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
今日推荐
行为型模式 - 解释器模式Interpreter的更多相关文章
- 【设计模式】行为型11解释器模式(Interpreter Pattern)
解释器模式(Interpreter Pattern) 解释器模式应用场景比较小,也没有固定的DEMO,中心思想就是自定义解释器用来解释固定的对象. 定义:给定一个语言,定义它的文法表示,并定义一个 ...
- 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式
[状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...
- javascript设计模式 - 解释器模式(interpreter)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 23、Interpreter 解释器模式
1.Interpreter 解释器模式 解释器模式是一种使用频率相对较低但学习难度较大的设计模式,它用于描述如何使用面向对象语言构成一个简单的语言解释器.在某些情况下,为了更好地描述某一些特定类型的问 ...
- C#设计模式学习笔记:(23)解释器模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8242238.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第十一个模式-- ...
- 折腾Java设计模式之解释器模式
解释器模式 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 意图 给定一个语言,定义它的文法表 ...
- Java设计模式----解释器模式
计算器中,我们输入“20 + 10 - 5”,计算器会得出结果25并返回给我们.可你有没有想过计算器是怎样完成四则运算的?或者说,计算器是怎样识别你输入的这串字符串信息,并加以解析,然后执行之,得出结 ...
- 大话设计模式Python实现-解释器模式
解释器模式(Interpreter Pattern):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 下面是一个解释器模式的demo: #!/usr/ ...
- [Python设计模式] 第27章 正则表达式——解释器模式
github地址:https://github.com/cheesezh/python_design_patterns 解释器模式 解释器模式,给定一个语言,定一个它的文法的一种表示,并定一个一个解释 ...
随机推荐
- 论文笔记 - PRISM: A Rich Class of Parameterized Submodular Information Measures for Guided Subset Selection
Motivation 与 Active Learning 类似,Target Learning 致力于 挑选外卖更"感兴趣"的数据,即人为为更重要的数据添加 bias.例如我们当前 ...
- cookie中 防止重复存值 (可用于历史记录等)
function makeCookie($key,$val){ // 查看cookie中是否已经存过键为history_ids if(Cookie::has($key)){ // 已经存过了 $jso ...
- go cookie session
https://astaxie.gitbooks.io/build-web-application-with-golang/content/zh/06.1.html
- 简单的sql注入2
尝试 1 1' 1" 发现1'还是会报错,所以注入口还是1' 再试试1' and '1'='1发现报出SQLi detected! 取消空格试试1'and'1'='1 似乎可以进入,应该就是 ...
- Python基础之数据库:2、MySQL的下载与安装、基本使用、系统服务制作
目录 一.MySQL简介 二.安装与下载 1.下载流程 2.配置环境变量 三.主要目录介绍 四.基本使用 五.系统服务的制作 六.密码相关 1.修改管理员密码 2.忘记密码 一.MySQL简介 M ...
- Day20:继承详解
继承的理解 继承:对类进行抽象化:也就是将存在的类构造成新的类: 比如说学生是一个类,老师是一个类,那么我们可以将学生类和老师类收纳进人这个类:那么学生和老师则为子类(派生类).人为父类(基类):子类 ...
- Devexpress 图表显示数据标签
dev的图标功能非常强大其中有一些设置可以更好的展现出数据 设置Series的标签 series.LabelsVisibility = DevExpress.Utils.DefaultBoolean. ...
- C温故补缺(七):函数指针与回调函数
函数指针与回调函数 函数指针就是指向函数调用栈地址的指针,定义时须和函数的返回值类型,参数类型相同 如: #include<stdio.h> int max(int x,int y){ r ...
- jQuery 十三中选择器总结
<body style="overflow: scroll;"> <h1>我的测试</h1> <div id="111" ...
- ArcGIS 添加Excel数据 报错 ArcGIS Failed to connect to database 外部数据库驱动程序(1)中的意外错误
原因是因为 操作系统安装了一些补丁,卸载即可. 把以下补丁卸载掉即可. win7 <-- KB4041678 , KB4041681 --> SERVER 2008 R2 <-- ...