解释器模式

前言

在游戏中需要生成json的存档文件时(比如游戏中音效大小的存储),就可以使用解释器模式来生成此文件,解释器就相当于翻译员,接下来实现对象和Json文件相互转换的功能。

1.实现Json解释器

对象转换json格式的字符串,需要知道json格式的字符串到底何样,经过查阅资料,感觉介绍的细腻和清晰的就是以下网站:

https://www.cnblogs.com/abella/p/11125685.html

知道格式以后,来尝试一下写出对象转换成json的类,具体代码如下:

    public class Student
    {
        private string name;
        private int age;
        private List<Student> friends;

         
        public Student(string name,int age)
        {
            this.name = name;
            this.age = age;
            friends = new List<Student>();
        }

        public void AddStudent(Student student)
        {
            friends.Add(student);
        }

        public string ToJson(Student student)
        {
            StringBuilder jsonBuilder = new StringBuilder();
            jsonBuilder.AppendLine("{");
            jsonBuilder.AppendFormat("\t\"{0}\" : \"{1}\",", nameof(name),name);
            jsonBuilder.AppendFormat("\t\"{0}\" : \"{1}\",", nameof(age), age);
            jsonBuilder.AppendFormat("\t\"{0}\" :[",nameof(friends));
            foreach (Student stu in friends)
            {
                jsonBuilder.AppendFormat("\t{\t\t\"{0}\" : \"{1}\",", nameof(name), name);
                jsonBuilder.AppendFormat("\t\t\"{0}\" : \"{1}\"\t},", nameof(age), age);
            }
            jsonBuilder.AppendLine("}");
            return jsonBuilder.ToString();
        }
    }

可以看到ToJson函数拟定了转换成Json格式的方式,但是考虑一个问题,这个只能用于Student类,如果以后定义其他类,难道还要重新定义一个专属的ToJson函数?这个也太糟糕了,作为优秀的程序员可不想重复造一个东西,接下来将思考如何实现所有对象都可以复用Json解释器。

2.解释器复用

C#所有对象都是继承object的,可能这样思考一下object能不能获取参数转换成Json格式的字符串,经过一番资料的查阅,可以使用C#的反射机制来实现object与json文件的相互转换即可,具体实现代码如下:

        public static string ToJson(object tmp)
        {
            StringBuilder builder = new StringBuilder("{");
            Type type = tmp.GetType();
            FieldInfo[] fieldInfos = type.GetFields(BindingFlags.NonPublic|
                BindingFlags.Instance|BindingFlags.Public);
            foreach (var item in fieldInfos)
            {
                if (item.FieldType.BaseType.Name.Equals(nameof(ValueType)))
                    builder.AppendFormat("\"{0}\":{1},", item.Name, item.GetValue(tmp));
                else if (item.FieldType.Name.Equals(nameof(String)))
                    builder.AppendFormat("\"{0}\":\"{1}\",", item.Name, item.GetValue(tmp));
                else
                {

                }
            }

            string json = builder.ToString();
            json = json.Substring(0, json.Length - 1);//去掉最后一个,
            json += "}";
            return json;
        }

这个对象里面如果存在列表,字典或者其他类对象成员是不会被转换的(以上代码没有实现这个功能),如果想要改成万能的Json解释器,请自行查看有无接口去实现效果。首先思考一下,如果要实现万能解释器,一定是使用递归的方式,因为一个类对象存了别的类的对象,别的类对象又存着别的对象,然后以此类推,可能形成了一个链子。

总结

1.解释器优缺点

优点: 1、增加了新的解释表达式的方式。 2、易于简单实现某种格式文本。

缺点: 1、一个简单语法可能需要复杂的解释场景。2、可利用场景比较少。

2.解释器使用场景

1.json,xml等等的解释器。

2.数据库语法实现简单的调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值