Design Pattern --- Interpreter
class BooleanExp { public: // Interface. virtual bool Evaluate() const = 0; }; class AndExp : public BooleanExp { // data. BooleanExp &m_booleanExpA, &m_booleanExpB; public: AndExp(BooleanExp &booleanExpA, BooleanExp &booleanExpB) : m_booleanExpA(booleanExpA), m_booleanExpB(booleanExpB) {} public: // Interface. virtual bool Evaluate() const override { return m_booleanExpA.Evaluate() && m_booleanExpB.Evaluate(); } }; class OrExp : public BooleanExp { // data. BooleanExp &m_booleanExpA, &m_booleanExpB; public: OrExp(BooleanExp &booleanExpA, BooleanExp &booleanExpB) : m_booleanExpA(booleanExpA), m_booleanExpB(booleanExpB) {} public: // Interface. virtual bool Evaluate() const override { return m_booleanExpA.Evaluate() || m_booleanExpB.Evaluate(); } }; class NotExp : public BooleanExp { // data. BooleanExp &m_booleanExp; public: NotExp(BooleanExp &booleanExp) : m_booleanExp(booleanExp) {} public: // Interface. virtual bool Evaluate() const override { return !m_booleanExp.Evaluate(); } }; class ConstantExp : public BooleanExp { // data. bool m_value; public: ConstantExp(bool value) : m_value(value) {} // 只有这个类是可以被用户直接使用 'true/false' 初始化的. public: // 剩下的类都是 Composite, 用于同一对待所有的表达式, 以 // Interface. // 支持递归组合. virtual bool Evaluate() const override { return m_value; } }; int main(int argc, char *argv[]) { cout <<OrExp(NotExp(ConstantExp(false)), AndExp(ConstantExp(true), ConstantExp(false))).Evaluate() <<endl; return 0; }
个人认为, Interpreter 是 Composite 的一个应用.
此模式给我的启发是: 当遇到结构化的语法时, 应该考虑递归组合的方式处理数据, 而不是顺序化的硬分析.