zoukankan      html  css  js  c++  java
  • Head First设计模式——蝇量模式和解释器模式

    蝇量

    蝇量模式:如果让某个类的一个实例能用来提供许多“虚拟实例”,就使用蝇量模式。

    在一个设计房子的平台中,周围要加上一些树,树有一个坐标XY坐标位置,而且可以根据树的年龄动态将自己绘制出来。如果我们创建许多树之后,会有许多树的实例对象。使用一个树实例和一个客户对象来维护“所有”树的状态,这就是蝇量模式。

    设计类图:

    实现代码:

    ①创建一个存储树状态的类

    1     public class TreeState
    2     {
    3         public int X { get; set; }
    4         public int Y { get; set; }
    5         public int Age { get; set; }
    6     }

    ②创建一个没有状态的树对象

    1     public class Tree
    2     {
    3         public void Display(int x, int y, int age) {
    4             Console.WriteLine($"坐标:{x},{y}  树龄:{age}");
    5         }
    6     }

    ③创建管理对象

     1     public class TreeManager
     2     {
     3         List<TreeState> treeArray;
     4         private Tree treeObj;
     5         public TreeManager(List<TreeState> trees) {
     6             treeArray = trees;
     7             treeObj = new Tree();
     8         }
     9 
    10         public void DispalyTress() {
    11             foreach (var tree in treeArray)
    12             {
    13                 treeObj.Display(tree.X, tree.Y, tree.Age);
    14             }
    15         }
    16     }

    优点:

    1、减少运行时对象实例的个数,节省内存。

    2、将许多”虚拟“对象的状态集中管理。

    用途和缺点:

    1、当一个类有许多的实例,而这些实例能够被统一方法控制,我们就可以使用蝇量模式。

    2、蝇量的缺点在于一旦你实现了它,单个实例无法拥有独立而不同的行为。

    解释器

    解释器模式:为语言创建解释器

    给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。每个语法规则都用一个类代表。请特别留意,类直接映射到语法。

    一般书中讲解的模式不一定在我们使用的时候需要完全照搬,可以多些对应的解释器类都是合理的。

    类图:

    示例代码:

    ①抽象类

    1     public interface Expression
    2     {
    3         /// <summary>
    4         /// 解释方法
    5         /// </summary>
    6         /// <param name="input"></param>
    7         /// <returns></returns>
    8         public Object interpret(String input);
    9     }

    ②终结符表达式类

    1     public class TerminalExpression : Expression
    2     {
    3         public object interpret(string input)
    4         {
    5             //对终结符表达式的解析
    6             return null;
    7         }
    8     }

    ③非终结表达式类

     1     public class NonterminalExpression : Expression
     2     {
     3         private Expression exp1;
     4         private Expression exp2;
     5         public Object interpret(string input)
     6         {
     7             //非终结符表达式的解析处理
     8             return null;
     9         }
    10     }

    ④上下文类

     1     public class Context
     2     {
     3         private Expression exp;
     4         public Context()
     5         {
     6             //数据初始化或者对象等
     7         }
     8         public void operation(string input)
     9         {
    10             //解析语句操作
    11         }
    12     }

    优点:

    1、将每一个语法规则表示成一个类,方便于实现语言。

    2、因为语法由许多类表示,所以可以轻易地改变或扩展语言。

    3、通过在类结构中加入新方法,可以在解释的同时增加新行为,例如打印格式美化或进行复杂程序验证。

    用途和缺点:

    1、当需要实现一个简单的语言时,使用解释器。

    2、可以处理脚本语言和编程语言。

    3、当语法数目太大太复杂时,这个模式会变得繁杂。

  • 相关阅读:
    Thinhole类声明和实现
    Pinhole类声明和实现
    Camera类定义和实现
    同心映射定义和测试
    Hammersley采样类定义和测试
    NRooks采样类定义和测试
    MultiJittered采样类定义和测试
    Jittered采样类定义和测试
    git分支操作
    Git单人本地仓库操作
  • 原文地址:https://www.cnblogs.com/SunSpring/p/12485903.html
Copyright © 2011-2022 走看看