zoukankan      html  css  js  c++  java
  • 设计模式漫谈之解释器模式

    今天5月1号了,回郑州,在家待了三天。打了几天手游,花了不少钱。家里准备再盖座房子,我也应该为家里做些贡献。真他娘累,30多了,单身,现在已有些恐婚了。近期有空要做个记账软件,否则钱花的太快了。这个月,20多号还要软考,我这应该是考不过了,基本放弃了。老板原说涨3K,又变成2K,坑,套路。

    近期我写的代码有上层到github和csdn code中,这种托管代码平台绝对是程序员的福利。

    闲话少扯,继续说设计模式,从今天起就开始说行为模式。刚看到C#版本都更新到8.0了,让我意识到,编程思想很重要,否则做程序员绝对累。思想上的东西就是内功,内功屌打出来的普通招式也牛13.

    写代码的时候不要刻意用设计模式,用编程思想是根本。像面向对象的语言C#,设计的时候可以从两个方面入手,抽象方面=》具体;核心代码=》封装。原则就是易扩展,易维护,高内聚低耦合。

    类型从数量上分,可以是两种,表示单个数的类型,表示多个数的类型。

    抽象的,接口,所有不具体的,只能做引用,不能创造对象。在面向对象中所有对象必须有宿主。

    编程界四大神器,编译器,解释器,链接器,调试器。把一种表现形式解释成另一种表现形式。

    说起来绕,直接上代码。我来解释说明。

    //包装属性的宿主类

    class PlayContext
    {

    private string text;
    public string PlayText
    {
    get { return text; }
    set { text = value; }
    }
    }

    //抽象概念上就是对内容进行解释。

    abstract class Expression
    {

    public void Interpret(PlayContext context)
    {
    if (context.PlayText.Length == 0)
    {
    return;
    }
    else
    {
    string playKey = context.PlayText.Substring(0, 1);
    context.PlayText = context.PlayText.Substring(2);
    double playValue = Convert.ToDouble(context.PlayText.Substring(0, context.PlayText.IndexOf(" ")));
    context.PlayText = context.PlayText.Substring(context.PlayText.IndexOf(" ") + 1);

    Excute(playKey, playValue);

    }
    }
    //不同的具体解释内容
    public abstract void Excute(string key, double value);
    }

    //具体的解释内容

    class Note : Expression
    {
    public override void Excute(string key, double value)
    {
    string note = "";
    switch (key)
    {
    case "C":
    note = "1";
    break;
    case "D":
    note = "2";
    break;
    case "E":
    note = "3";
    break;
    case "F":
    note = "4";
    break;
    case "G":
    note = "5";
    break;
    case "A":
    note = "6";
    break;
    case "B":
    note = "7";
    break;

    }
    Console.Write("{0} ", note);
    }
    }

    //不同的解释内容

    class Scale : Expression
    {
    public override void Excute(string key, double value)
    {
    string scale = "";
    switch (Convert.ToInt32(value))
    {
    case 1:
    scale = "低音";
    break;
    case 2:
    scale = "中音";
    break;
    case 3:
    scale = "高音";
    break;

    }
    Console.Write("{0} ", scale);
    }
    }

    //对不同的情况进行解释

    PlayContext context = new PlayContext();

    Console.WriteLine("上海滩:");
    //context.演奏文本 = "T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 D 0.5 E 0.5 G 3 D 0.5 E 0.5 O 1 A 3 A 0.5 O 2 C 0.5 D 1.5 E 0.5 D 0.5 O 1 B 0.5 A 0.5 O 2 C 0.5 O 1 G 3 P 0.5 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 D 0.5 E 0.5 G 3 D 0.5 E 0.5 O 1 A 3 A 0.5 O 2 C 0.5 D 1.5 E 0.5 D 0.5 O 1 B 0.5 A 0.5 G 0.5 O 2 C 3 P 0.5 O 3 C 0.5 C 0.5 O 2 A 0.5 O 3 C 2 P 0.5 O 2 A 0.5 O 3 C 0.5 O 2 A 0.5 G 2.5 G 0.5 E 0.5 A 1.5 G 0.5 C 1 D 0.25 C 0.25 D 0.5 E 2.5 E 0.5 E 0.5 D 0.5 E 2.5 O 3 C 0.5 C 0.5 O 2 B 0.5 A 3 E 0.5 E 0.5 D 1.5 E 0.5 O 3 C 0.5 O 2 B 0.5 A 0.5 E 0.5 G 2 P 0.5 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 D 0.5 E 0.5 G 3 D 0.5 E 0.5 O 1 A 3 A 0.5 O 2 C 0.5 D 1.5 E 0.5 D 0.5 O 1 B 0.5 A 0.5 G 0.5 O 2 C 3 ";
    context.PlayText = "T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ";

    //Console.WriteLine("隐形的翅膀:");
    //context.演奏文本 = "T 1000 O 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 E 1 D 0.5 C 0.5 C 0.5 C 0.5 C 0.5 O 1 A 0.25 G 0.25 G 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 G 0.5 D 0.25 E 0.25 D 0.5 C 0.25 D 0.25 D 1 A 0.5 G 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 E 0.5 D 0.5 C 0.5 C 0.25 D 0.25 O 1 A 1 G 0.5 A 0.5 O 2 C 1.5 D 0.25 E 0.25 D 1 E 0.5 C 0.5 C 3 O 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 E 1 D 0.5 C 0.5 C 0.5 C 0.5 C 0.5 O 1 A 0.25 G 0.25 G 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 G 0.5 D 0.25 E 0.25 D 0.5 C 0.25 D 0.25 D 1 A 0.5 G 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 E 0.5 D 0.5 C 0.5 C 0.25 D 0.25 O 1 A 1 G 0.5 A 0.5 O 2 C 1.5 D 0.25 E 0.25 D 1 E 0.5 C 0.5 C 3 E 0.5 G 0.5 O 3 C 1.5 O 2 B 0.25 O 3 C 0.25 O 2 B 1 A 0.5 G 0.5 A 0.5 O 3 C 0.5 O 2 E 0.5 D 0.5 C 1 C 0.5 C 0.5 C 0.5 O 3 C 1 O 2 G 0.25 A 0.25 G 0.5 D 0.25 E 0.25 D 0.5 C 0.25 D 0.25 D 3 E 0.5 G 0.5 O 3 C 1.5 O 2 B 0.25 O 3 C 0.25 O 2 B 1 A 0.5 G 0.5 A 0.5 O 3 C 0.5 O 2 E 0.5 D 0.5 C 1 C 0.5 C 0.5 C 0.5 O 3 C 1 O 2 G 0.25 A 0.25 G 0.5 D 0.25 E 0.25 D 0.5 C 0.5 C 3 ";
    Expression expression = null;
    try
    {
    while (context.PlayText.Length > 0)
    {
    string str = context.PlayText.Substring(0, 1);
    switch (str)
    {
    case "O":
    expression = new Scale();
    break;
    case "T":
    expression = new Speed();
    break;
    case "C":
    case "D":
    case "E":
    case "F":
    case "G":
    case "A":
    case "B":
    case "P":
    expression = new Note();
    break;

    }

    //分不同情况操作同一个实例
    expression.Interpret(context);

    }
    }
    catch (Exception ex)
    {
    Console.WriteLine(ex.Message);
    }

    Console.Read();

    总结:解释模式就是对一种表现形式的另一种解释。使用设计模式的目的就是为了易扩展易维护,也正是因为面向对象中有抽象与具体分开的继承,实现的机制。

    程序员最宝贵的是编程思想,不扯了,现在心有点不静,到此为止吧,大家多多包涵。

  • 相关阅读:
    Docker基础 镜像,容器,仓库核心概念 常用命令和软件安装示例
    JHipster创建微服务及相关微服务架构组件介绍
    PageHelper分页插件及相关案例介绍
    DataTables API及服务端处理模式介绍和后端分页案例
    微服务概念及SpringCloud五大神兽介绍
    GitHub上重要的几个搜索技巧
    Java 内存区域详解
    莫等闲,白了少年头,空悲切!
    解决Mongoose中populate方法导致模板引擎art-template无法渲染的问题,错误-RangeError: Maximum call stack size exceeded
    vscode添加到右键菜单【win10系统】
  • 原文地址:https://www.cnblogs.com/wang-charle/p/8976756.html
Copyright © 2011-2022 走看看