dart_in_action/28_design_pattern_interpret...

71 lines
2.0 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
解释器模式Interpreter Pattern
意图:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
主要解决:对于一些固定文法构建一个解释句子的解释器。
何时使用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
如何解决:构建语法树,定义终结符与非终结符。
*/
main(List<String> args) {
Expression robert = TerminalExpression("Robert");
Expression john = TerminalExpression("John");
Expression isMale = OrExpression(robert, john);
print("John is male? ${isMale.interpret('john')}");
Expression julie = TerminalExpression("Julie");
Expression married = TerminalExpression("Married");
Expression isMarriedWoman = AndExpression(julie, married);
print(
"Julie is a married women? ${isMarriedWoman.interpret('Married Julie')}");
}
//////////////////////////////////////////////////////////////////
///
/// 创建一个表达式接口
///
abstract class Expression {
bool interpret(String context);
}
///
/// 创建实现了上述接口的实体类
///
class TerminalExpression implements Expression {
String _data;
TerminalExpression(this._data);
@override
bool interpret(String context) {
if (context.contains(_data)) {
return true;
}
return false;
}
}
class OrExpression implements Expression {
Expression _expr1;
Expression _expr2;
OrExpression(this._expr1, this._expr2);
@override
bool interpret(String context) {
return _expr1.interpret(context) || _expr2.interpret(context);
}
}
class AndExpression implements Expression {
Expression _expr1;
Expression _expr2;
AndExpression(this._expr1, this._expr2);
@override
bool interpret(String context) {
return _expr1.interpret(context) && _expr2.interpret(context);
}
}