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 的一个应用.
此模式给我的启发是: 当遇到结构化的语法时, 应该考虑递归组合的方式处理数据, 而不是顺序化的硬分析.

posted @ 2013-02-01 15:44  walfud  阅读(166)  评论(0编辑  收藏  举报