解释器模式:语法规则也是类
1.工厂模式:提供创建对象的接口2.单例模式:生成只存在一个的实例3.桥接模式:将类的功能层次和实现层次分离,动态结合4.享元模式:避免大量相同开销5.原型模式:通过复制生成实例6.建造者模式:组装复杂实例7.职责链模式:推卸责任8.模板模式:具体的步骤延迟到子类中实现9.迭代器模式:一个个遍历10.外观模式:隐藏了复杂系统的复杂性,并提供一个简单的接口来访问系统11.代理模式:为其他对象提供一种代理以控制对这个对象的访问12.适配器模式:将两个不兼容的类纠合在一起13.组合模式:处理树形结构数据14.装饰器模式:动态给一个对象添加一些额外的职责15.命令模式:命令也是类16.访问者模式:访问数据结构并处理数据17.观察者模式:发送状态变化通知18.状态模式:用类表示状态19.策略模式:整体替换算法
20.解释器模式:语法规则也是类
21.中介者模式:只有一个仲裁者22.备忘录模式:保存对象状态解释器模式是一种行为型设计模式,它定义了一种语言并解析该语言中的表达式。这种模式用于将一个表达式文法表示成一个抽象语法树,从而使得我们可以通过对语法树进行遍历来解释整个表达式。
在解释器模式中,包含以下几个角色:
- 抽象表达式(AbstractExpression):定义了一个抽象的解释操作,具体的终结符和非终结符都要实现这个接口。
- 终结符表达式(TerminalExpression):实现了抽象表达式接口的终结符表达式,用来实现语法规则中的终结符。
- 非终结符表达式(NonterminalExpression):实现了抽象表达式接口的非终结符表达式,用来实现语法规则中的非终结符。
- 环境类(Context):包含解释器需要的信息,通常以 Map 或者 List 的形式存在。
下面是一个简单的示例代码,演示了如何使用解释器模式来解析加减法表达式:
// 抽象表达式 interface Expression { int interpret(Context context); } // 终结符表达式 class Number implements Expression { private int number; public Number(int number) { this.number = number; } @Override public int interpret(Context context) { return number; } } // 非终结符表达式 class Plus implements Expression { private Expression leftExpression; private Expression rightExpression; public Plus(Expression leftExpression, Expression rightExpression) { this.leftExpression = leftExpression; this.rightExpression = rightExpression; } @Override public int interpret(Context context) { return leftExpression.interpret(context) + rightExpression.interpret(context); } } class Minus implements Expression { private Expression leftExpression; private Expression rightExpression; public Minus(Expression leftExpression, Expression rightExpression) { this.leftExpression = leftExpression; this.rightExpression = rightExpression; } @Override public int interpret(Context context) { return leftExpression.interpret(context) - rightExpression.interpret(context); } } // 环境类 class Context { private Map<String, Integer> variables = new HashMap<>(); public void assign(String variable, int value) { variables.put(variable, value); } public int getValue(String variable) { Integer value = variables.get(variable); if (value == null) { return 0; } return value; } } // 测试代码 public class InterpreterTest { public static void main(String[] args) { // a + b - c 表达式 Context context = new Context(); context.assign("a", 5); context.assign("b", 3); context.assign("c", 2); Expression expression = new Minus( new Plus(new Number(1), new Number(1)), new Number(2) ); int result = expression.interpret(context); System.out.println(result); // 输出 0 } }
在上面的代码中,我们定义了抽象表达式 Expression
和两个具体的终结符表达式 Number
和非终结符表达式 Plus
、Minus
。我们还定义了一个环境类 Context
,用于保存变量和变量的值。
在测试代码中,我们创建了一个 Context
对象,并向其中添加了三个变量及其对应的值。然后,我们使用解释器模式来解析加减法表达式 1 + 1 - 2
,并输出结果。
需要注意的是,本例子只是解释器模式的简单示例,并没有完全涵盖所有可能性。在实际应用中,您可能需要根据自己的需求进行一些调整和扩展。
合集:
Java设计模式
分类:
Java设计模式 / 行为型模式
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性