设计模式(10) 外观模式(FACADE)(二)

2014-11-24 02:50:38 · 作者: · 浏览: 4
ogramNode { public: virtual void GetSourcePositon(int& line, int& index); virtual void Add(ProgramNode*); virtual void Remove(ProgramNode*); virtual void Traverse(CodeGenerator&); protected: ProgramNode(); }; Traverse:以一个CodeGenerator对象为参数,ProgramNode子类使用这个对象产生机器代码,机器代码格式为BytecodeStream中的ByteCode对象。
CodeGenerator:一个访问者(访问者模式),有两个子类StackMachineCodeGenerator和RISCCodeGenerator,分别为不同的硬件体系结构生成机器代码。
class CodeGenerator {
public:
    virtual void Visit(StatementNode*);
    virtual void Visit(ExpressionNode*);

protected:
    CodeGenerator(BytecodeStream&);
protected:
    BytecodeStream& _output;
};
ExpressionNode:ProgramNode的每个子类在实现Traverse时,对它的ProgramNode子对象调用Traverse。每个子类一次对它的子节点做同样的动作。这样递归下去。
void ExpressionNode::Traverse (CodeGenerator& cg)
 {
    cg.Visit(this);
    ListIterator
    
      i(_children);

    for (i.First(); !i.IsDone(); i.Next()) 
    {
        i.CurrentItem()->Traverse(cg);
    }
}
    
上面这些类构成了编译子系统。 引用Compiler类,将所有的部件集成在一起。Compiler提供了一个简单的接口为特定的机器编译源代码并生成可执行代码。
class Compiler
{
public:
    Compiler();
    virtual void Compile(istream&, BytecodeStream);
};

void Compiler::Compile(istream& input, BytecodeStream& output)
{
    Scanner scanner(input);
    ProgramNodeBuilder builder;
    Parser parser;

    parser.Parse(scanner, builder);
    RISCCodeGenerator generator(builder);
    ProgramNode* parseTree = builder.GetRootNode();
    parserTree->Traverse(generator);
}


相关模式: 抽象工厂模式可以与Facade模式一起使用提供一个接口,这一接口可用来以一种子系统独立的方式创建子系统对象。抽象工厂模式也可以代替Facade模式隐藏那些与平台相关的类。 Mediator模式,通常集中不属于任何单个对象的功能。Facade模式不定义新功能,子系统也不知道facade的存在 通常仅需要一个Facade对象,因此Facade对象通常属于Singleton模式。


参考资料: 《设计模式:可复用面向对象软件的基础》