C#设计模式:解释器模式(Interpreter Pattern)
时间:2019-10-22
本文章向大家介绍C#设计模式:解释器模式(Interpreter Pattern),主要包括C#设计模式:解释器模式(Interpreter Pattern)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一,C#设计模式:解释器模式(Interpreter Pattern)
1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用解释器模式
2,解释器设计模式每个解释的类有自己的规则,并且与其他业务规则不冲突
二,如下代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _23.解释器模式 { /// <summary> /// Interpreter模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用Interpreter模式。 /// 1、当一个语言需要解释执行,并可以将该语言中的句子表示为一个抽象语法树的时候,可以考虑使用解释器模式(如XML文档解释、正则表达式等领域) /// 2、一些重复出现的问题可以用一种简单的语言来进行表达。 /// 3、一个语言的文法较为简单. /// 4、当执行效率不是关键和主要关心的问题时可考虑解释器模式(注:高效的解释器通常不是通过直接解释抽象语法树来实现的,而是需要将它们转换成其他形式,使用解释器模式的执行效率并不高。) /// </summary> class Program { static void Main(string[] args) { Context context = new Context("usachi"); List<PeopleInterpreter> interpreterList = new List<PeopleInterpreter>() { new Chinese(), new Usa(), }; foreach (var item in interpreterList) { item.Conversion(context); } Console.WriteLine(context.Get()); } } /// <summary> /// 上下文 /// </summary> public class Context { private string _Word = null; public Context(string word) { this._Word = word; } public void Set(string newWord) { this._Word = newWord; } public string Get() { return this._Word; } } /// <summary> /// 抽象解释器 /// </summary> public abstract class PeopleInterpreter { public abstract void Conversion(Context context); } /// <summary> /// 中国人业务 /// </summary> public class Chinese : PeopleInterpreter { private static Dictionary<char, string> _Dictionary = new Dictionary<char, string>(); /// <summary> /// 中国人自己解释规则 /// </summary> static Chinese() { _Dictionary.Add('u', "美国人"); _Dictionary.Add('s', "用刀叉"); _Dictionary.Add('a', "吃饭,"); } public override void Conversion(Context context) { Console.WriteLine(this.GetType().ToString() + "业务"); string text = context.Get(); if (string.IsNullOrEmpty(text)) return; List<string> numberList = new List<string>(); foreach (var item in text.ToLower().ToArray()) { if (_Dictionary.ContainsKey(item)) { numberList.Add(_Dictionary[item]); } else { numberList.Add(item.ToString()); } } context.Set(string.Concat(numberList)); } } /// <summary> /// 美国人业务 /// </summary> public class Usa : PeopleInterpreter { private static Dictionary<char, string> _Dictionary = new Dictionary<char, string>(); /// <summary> /// 美国人自己解释规则 /// </summary> static Usa() { _Dictionary.Add('c', "中国人"); _Dictionary.Add('h', "用"); _Dictionary.Add('i', "筷子吃饭"); } public override void Conversion(Context context) { Console.WriteLine(this.GetType().ToString() + "业务"); string text = context.Get(); if (string.IsNullOrEmpty(text)) return; List<string> numberList = new List<string>(); foreach (var item in text.ToLower().ToArray()) { if (_Dictionary.ContainsKey(item)) { numberList.Add(_Dictionary[item]); } else { numberList.Add(item.ToString()); } } context.Set(string.Concat(numberList)); } } }
原文地址:https://www.cnblogs.com/May-day/p/11718888.html
- TensorFlow全新的数据读取方式:Dataset API入门教程
- 不经意发现的dba_objects和dba_tables中的细节(r7笔记第56天)
- LeetCode——Longest Substring Without Repeating Characters
- Python time模块详解(时间戳↔元组形式↔格式化形式三者转化)
- Maven 核心原理解析(2)
- Linux C 编程——互斥锁mutex
- python两个 list 获取交集,并集,差集的方法.
- python——时间与时间戳之间的转换
- Maven 核心原理解析(3)
- String中的null,以及String s;等区别详解
- Shell编程——Shell中的数学运算
- 如何利用微信监管你的TF训练?
- python 安装spark_Spark环境搭建 (Python)
- MongoDB触发oom-killer的简单处理(一)(r7笔记第54天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- tomcat对AQS的扩展:使用LimitLatch控制连接数
- kubernete编排技术五:DaemonSet
- 深度剖析github上15.1k Star项目:redux-thunk
- 在不影响程序使用的情况下添加shellcode
- [K8s 1.9实践]Kubeadm 1.9 HA 高可用 集群 本地离线镜像部署
- ansible模块command、shell、raw、script
- systemd - CentOS 7进程守护&监控
- Java 8的新特性还不了解?快进来!
- 【Vulnhub】Play XML Entities
- 一切皆是映射:詳解 Kotlin Map 集合類
- 10大高性能开发宝石,我要消灭一半程序员!
- 面试官:你说你会RabbitMQ,那聊聊它的交换机(Exchange)吧
- Kubeadm 1.9 HA 高可用集群本地离线镜像部署【已验证】
- kubernetes(k8s)集群安装calico
- kubernetes(k8s) Prometheus+grafana监控告警安装部署