Unity implements design patterns - interpreter mode

Unity implements design patterns - interpreter mode

Interpreter Pattern is a mode that parses according to prescribed grammar, and is rarely used in real projects. Given a language, define a representation of its grammar, and define an interpreter that uses that representation to interpret sentences in the language.
Insert image description here
Here's an example to demonstrate: Convert Roman text to decimal format

1.Context

    class Context
    {
    
    
        private string _input;
        private int _output;

        // Constructor
        public Context(string input)
        {
    
    
            this._input = input;
        }

        // Gets or sets input
        public string Input
        {
    
    
            get {
    
     return _input; }
            set {
    
     _input = value; }
        }

        // Gets or sets output
        public int Output
        {
    
    
            get {
    
     return _output; }
            set {
    
     _output = value; }
        }
    }

2.Expression

Interpreter base class

    abstract class Expression
    {
    
    
        //"MCMXXVIII";
        public void Interpret(Context context)
        {
    
    
            if (context.Input.Length == 0)
                return;

            if (context.Input.StartsWith(Nine()))
            {
    
    
                context.Output += (9 * Multiplier());
                context.Input = context.Input.Substring(2);
            }
            else if (context.Input.StartsWith(Four()))
            {
    
    
                context.Output += (4 * Multiplier());
                context.Input = context.Input.Substring(2);
            }
            else if (context.Input.StartsWith(Five()))
            {
    
    
                context.Output += (5 * Multiplier());
                context.Input = context.Input.Substring(1);
            }

            while (context.Input.StartsWith(One()))
            {
    
    
                context.Output += (1 * Multiplier());
                context.Input = context.Input.Substring(1);
            }
        }

        public abstract string One();
        public abstract string Four();
        public abstract string Five();
        public abstract string Nine();
        public abstract int Multiplier();
    }

3.ThousandExpression

Thousands Digits Interpreter

    class ThousandExpression : Expression
    {
    
    
        public override string One() {
    
     return "M"; }
        public override string Four() {
    
     return " "; }
        public override string Five() {
    
     return " "; }
        public override string Nine() {
    
     return " "; }
        public override int Multiplier() {
    
     return 1000; }
    }

4.HundredExpression

Hundreds digit interpreter

    class HundredExpression : Expression
    {
    
    
        public override string One() {
    
     return "C"; }
        public override string Four() {
    
     return "CD"; }
        public override string Five() {
    
     return "D"; }
        public override string Nine() {
    
     return "CM"; }
        public override int Multiplier() {
    
     return 100; }
    }

5.TenExpression

Ten digit interpreter

    class TenExpression : Expression
    {
    
    
        public override string One() {
    
     return "X"; }
        public override string Four() {
    
     return "XL"; }
        public override string Five() {
    
     return "L"; }
        public override string Nine() {
    
     return "XC"; }
        public override int Multiplier() {
    
     return 10; }
    }

6.OneExpression

single digit interpreter

    class OneExpression : Expression
    {
    
    
        public override string One() {
    
     return "I"; }
        public override string Four() {
    
     return "IV"; }
        public override string Five() {
    
     return "V"; }
        public override string Nine() {
    
     return "IX"; }
        public override int Multiplier() {
    
     return 1; }
    }

7.Testing

    public class InterpreterExample1 : MonoBehaviour
    {
    
    
        void Start()
        {
    
    
            string roman = "MCMXXVIII";
            Context context = new Context(roman);

            // Build the 'parse tree'
            List<Expression> tree = new List<Expression>();
            tree.Add(new ThousandExpression());
            tree.Add(new HundredExpression());
            tree.Add(new TenExpression());
            tree.Add(new OneExpression());

            // Interpret
            foreach (Expression exp in tree)
            {
    
    
                exp.Interpret(context);
            }

            Debug.Log(roman+" = "+ context.Output);
        }
    }

Guess you like

Origin blog.csdn.net/zzzsss123333/article/details/133411997